@stack-spot/ai-chat-widget 1.37.0-beta.1 → 2.0.0-betacitric.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 (356) hide show
  1. package/CHANGELOG.md +1 -71
  2. package/dist/StackspotAIWidget.d.ts +6 -2
  3. package/dist/StackspotAIWidget.d.ts.map +1 -1
  4. package/dist/StackspotAIWidget.js +7 -8
  5. package/dist/StackspotAIWidget.js.map +1 -1
  6. package/dist/app-metadata.json +13 -17
  7. package/dist/chat-interceptors/quick-commands.d.ts.map +1 -1
  8. package/dist/chat-interceptors/quick-commands.js +3 -9
  9. package/dist/chat-interceptors/quick-commands.js.map +1 -1
  10. package/dist/components/AdaptiveTextArea.d.ts +1 -1
  11. package/dist/components/AdaptiveTextArea.d.ts.map +1 -1
  12. package/dist/components/AdaptiveTextArea.js +1 -1
  13. package/dist/components/AdaptiveTextArea.js.map +1 -1
  14. package/dist/components/AgentCard/AgentCardCreate.d.ts.map +1 -1
  15. package/dist/components/AgentCard/AgentCardCreate.js +4 -5
  16. package/dist/components/AgentCard/AgentCardCreate.js.map +1 -1
  17. package/dist/components/AgentCard/index.d.ts.map +1 -1
  18. package/dist/components/AgentCard/index.js +5 -6
  19. package/dist/components/AgentCard/index.js.map +1 -1
  20. package/dist/components/ButtonFavorite.d.ts +8 -7
  21. package/dist/components/ButtonFavorite.d.ts.map +1 -1
  22. package/dist/components/ButtonFavorite.js +5 -14
  23. package/dist/components/ButtonFavorite.js.map +1 -1
  24. package/dist/components/Code.d.ts.map +1 -1
  25. package/dist/components/Code.js +11 -9
  26. package/dist/components/Code.js.map +1 -1
  27. package/dist/components/ComponentNavigator.d.ts.map +1 -1
  28. package/dist/components/ComponentNavigator.js +2 -4
  29. package/dist/components/ComponentNavigator.js.map +1 -1
  30. package/dist/components/FadingOverflow.d.ts.map +1 -1
  31. package/dist/components/FadingOverflow.js +3 -4
  32. package/dist/components/FadingOverflow.js.map +1 -1
  33. package/dist/components/FileDescription.d.ts +0 -1
  34. package/dist/components/FileDescription.d.ts.map +1 -1
  35. package/dist/components/FileDescription.js +3 -4
  36. package/dist/components/FileDescription.js.map +1 -1
  37. package/dist/components/HistoryList.js +1 -1
  38. package/dist/components/HistoryList.js.map +1 -1
  39. package/dist/components/ListResource.js +3 -3
  40. package/dist/components/ListResource.js.map +1 -1
  41. package/dist/components/Markdown.js +1 -1
  42. package/dist/components/Markdown.js.map +1 -1
  43. package/dist/components/Modal.d.ts.map +1 -1
  44. package/dist/components/Modal.js +2 -4
  45. package/dist/components/Modal.js.map +1 -1
  46. package/dist/components/QuickStartButton.d.ts +2 -3
  47. package/dist/components/QuickStartButton.d.ts.map +1 -1
  48. package/dist/components/QuickStartButton.js +4 -3
  49. package/dist/components/QuickStartButton.js.map +1 -1
  50. package/dist/components/RightPanelForm.d.ts.map +1 -1
  51. package/dist/components/RightPanelForm.js +20 -13
  52. package/dist/components/RightPanelForm.js.map +1 -1
  53. package/dist/components/RightPanelTabs.d.ts +1 -4
  54. package/dist/components/RightPanelTabs.d.ts.map +1 -1
  55. package/dist/components/RightPanelTabs.js +4 -16
  56. package/dist/components/RightPanelTabs.js.map +1 -1
  57. package/dist/components/Selector/index.d.ts.map +1 -1
  58. package/dist/components/Selector/index.js +5 -8
  59. package/dist/components/Selector/index.js.map +1 -1
  60. package/dist/components/Selector/styled.d.ts.map +1 -1
  61. package/dist/components/Selector/styled.js +8 -5
  62. package/dist/components/Selector/styled.js.map +1 -1
  63. package/dist/components/StackedBadge.js +5 -5
  64. package/dist/components/StackedBadge.js.map +1 -1
  65. package/dist/components/TabManager.d.ts.map +1 -1
  66. package/dist/components/TabManager.js +8 -31
  67. package/dist/components/TabManager.js.map +1 -1
  68. package/dist/components/ToolBadge.d.ts +3 -8
  69. package/dist/components/ToolBadge.d.ts.map +1 -1
  70. package/dist/components/ToolBadge.js +21 -99
  71. package/dist/components/ToolBadge.js.map +1 -1
  72. package/dist/components/WorkspaceTabNavigator.d.ts.map +1 -1
  73. package/dist/components/WorkspaceTabNavigator.js +7 -9
  74. package/dist/components/WorkspaceTabNavigator.js.map +1 -1
  75. package/dist/components/form/DescribedCheckboxGroup.d.ts +24 -2
  76. package/dist/components/form/DescribedCheckboxGroup.d.ts.map +1 -1
  77. package/dist/components/form/DescribedCheckboxGroup.js +46 -29
  78. package/dist/components/form/DescribedCheckboxGroup.js.map +1 -1
  79. package/dist/components/form/DescribedRadioGroup.d.ts +24 -4
  80. package/dist/components/form/DescribedRadioGroup.d.ts.map +1 -1
  81. package/dist/components/form/DescribedRadioGroup.js +39 -18
  82. package/dist/components/form/DescribedRadioGroup.js.map +1 -1
  83. package/dist/index.d.ts +1 -1
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +0 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/layout.css +1 -27
  88. package/dist/right-panel/DefaultPanel.d.ts.map +1 -1
  89. package/dist/right-panel/DefaultPanel.js +2 -4
  90. package/dist/right-panel/DefaultPanel.js.map +1 -1
  91. package/dist/state/ChatEntry.d.ts +3 -4
  92. package/dist/state/ChatEntry.d.ts.map +1 -1
  93. package/dist/state/ChatEntry.js.map +1 -1
  94. package/dist/state/constants.js +2 -2
  95. package/dist/state/constants.js.map +1 -1
  96. package/dist/types.d.ts +7 -3
  97. package/dist/types.d.ts.map +1 -1
  98. package/dist/utils/tools.d.ts +1 -2
  99. package/dist/utils/tools.d.ts.map +1 -1
  100. package/dist/utils/tools.js +1 -12
  101. package/dist/utils/tools.js.map +1 -1
  102. package/dist/utils/upload/FileUpload.d.ts.map +1 -1
  103. package/dist/utils/upload/FileUpload.js +2 -1
  104. package/dist/utils/upload/FileUpload.js.map +1 -1
  105. package/dist/views/Agents/AgentDescription.d.ts.map +1 -1
  106. package/dist/views/Agents/AgentDescription.js +5 -6
  107. package/dist/views/Agents/AgentDescription.js.map +1 -1
  108. package/dist/views/Agents/AgentsPanel.d.ts.map +1 -1
  109. package/dist/views/Agents/AgentsPanel.js +7 -7
  110. package/dist/views/Agents/AgentsPanel.js.map +1 -1
  111. package/dist/views/Agents/AgentsTab.d.ts.map +1 -1
  112. package/dist/views/Agents/AgentsTab.js +29 -28
  113. package/dist/views/Agents/AgentsTab.js.map +1 -1
  114. package/dist/views/Agents/dictionary.d.ts +1 -1
  115. package/dist/views/Chat/AgentInfo.d.ts.map +1 -1
  116. package/dist/views/Chat/AgentInfo.js +3 -5
  117. package/dist/views/Chat/AgentInfo.js.map +1 -1
  118. package/dist/views/Chat/ChatMessage.d.ts.map +1 -1
  119. package/dist/views/Chat/ChatMessage.js +28 -36
  120. package/dist/views/Chat/ChatMessage.js.map +1 -1
  121. package/dist/views/Chat/StepsList.d.ts.map +1 -1
  122. package/dist/views/Chat/StepsList.js +10 -10
  123. package/dist/views/Chat/StepsList.js.map +1 -1
  124. package/dist/views/Chat/styled.d.ts.map +1 -1
  125. package/dist/views/Chat/styled.js +8 -2
  126. package/dist/views/Chat/styled.js.map +1 -1
  127. package/dist/views/ChatHistory/HistoryItem.d.ts.map +1 -1
  128. package/dist/views/ChatHistory/HistoryItem.js +7 -14
  129. package/dist/views/ChatHistory/HistoryItem.js.map +1 -1
  130. package/dist/views/ChatHistory/index.js +1 -1
  131. package/dist/views/ChatHistory/index.js.map +1 -1
  132. package/dist/views/ChatHistory/styled.d.ts.map +1 -1
  133. package/dist/views/ChatHistory/styled.js +3 -5
  134. package/dist/views/ChatHistory/styled.js.map +1 -1
  135. package/dist/views/ChatTabSelection.d.ts +6 -1
  136. package/dist/views/ChatTabSelection.d.ts.map +1 -1
  137. package/dist/views/ChatTabSelection.js +12 -7
  138. package/dist/views/ChatTabSelection.js.map +1 -1
  139. package/dist/views/Editor.d.ts.map +1 -1
  140. package/dist/views/Editor.js +6 -12
  141. package/dist/views/Editor.js.map +1 -1
  142. package/dist/views/Home/BuiltInAgent.d.ts.map +1 -1
  143. package/dist/views/Home/BuiltInAgent.js +2 -3
  144. package/dist/views/Home/BuiltInAgent.js.map +1 -1
  145. package/dist/views/Home/CustomAgent.js +3 -3
  146. package/dist/views/Home/CustomAgent.js.map +1 -1
  147. package/dist/views/Home/index.js +2 -2
  148. package/dist/views/Home/index.js.map +1 -1
  149. package/dist/views/Home/styled.d.ts.map +1 -1
  150. package/dist/views/Home/styled.js +21 -22
  151. package/dist/views/Home/styled.js.map +1 -1
  152. package/dist/views/KSDocument.d.ts.map +1 -1
  153. package/dist/views/KSDocument.js +3 -4
  154. package/dist/views/KSDocument.js.map +1 -1
  155. package/dist/views/KnowledgeSources.d.ts.map +1 -1
  156. package/dist/views/KnowledgeSources.js +14 -36
  157. package/dist/views/KnowledgeSources.js.map +1 -1
  158. package/dist/views/MessageInput/AgentSelector.d.ts.map +1 -1
  159. package/dist/views/MessageInput/AgentSelector.js +7 -5
  160. package/dist/views/MessageInput/AgentSelector.js.map +1 -1
  161. package/dist/views/MessageInput/ButtonAgent.d.ts.map +1 -1
  162. package/dist/views/MessageInput/ButtonAgent.js +4 -5
  163. package/dist/views/MessageInput/ButtonAgent.js.map +1 -1
  164. package/dist/views/MessageInput/ButtonBar.d.ts.map +1 -1
  165. package/dist/views/MessageInput/ButtonBar.js +2 -4
  166. package/dist/views/MessageInput/ButtonBar.js.map +1 -1
  167. package/dist/views/MessageInput/ContextBar.d.ts.map +1 -1
  168. package/dist/views/MessageInput/ContextBar.js +3 -6
  169. package/dist/views/MessageInput/ContextBar.js.map +1 -1
  170. package/dist/views/MessageInput/QuickCommandSelector.js +2 -2
  171. package/dist/views/MessageInput/QuickCommandSelector.js.map +1 -1
  172. package/dist/views/MessageInput/SelectContent.d.ts.map +1 -1
  173. package/dist/views/MessageInput/SelectContent.js +30 -35
  174. package/dist/views/MessageInput/SelectContent.js.map +1 -1
  175. package/dist/views/MessageInput/UploadBar.d.ts.map +1 -1
  176. package/dist/views/MessageInput/UploadBar.js +2 -29
  177. package/dist/views/MessageInput/UploadBar.js.map +1 -1
  178. package/dist/views/MessageInput/UploadDragNDrop.d.ts.map +1 -1
  179. package/dist/views/MessageInput/UploadDragNDrop.js +2 -3
  180. package/dist/views/MessageInput/UploadDragNDrop.js.map +1 -1
  181. package/dist/views/MessageInput/dictionary.d.ts +1 -1
  182. package/dist/views/MessageInput/dictionary.d.ts.map +1 -1
  183. package/dist/views/MessageInput/dictionary.js +0 -4
  184. package/dist/views/MessageInput/dictionary.js.map +1 -1
  185. package/dist/views/MessageInput/index.d.ts.map +1 -1
  186. package/dist/views/MessageInput/index.js +3 -4
  187. package/dist/views/MessageInput/index.js.map +1 -1
  188. package/dist/views/MessageInput/styled.d.ts +1 -3
  189. package/dist/views/MessageInput/styled.d.ts.map +1 -1
  190. package/dist/views/MessageInput/styled.js +11 -27
  191. package/dist/views/MessageInput/styled.js.map +1 -1
  192. package/dist/views/MinimizedHeader.d.ts.map +1 -1
  193. package/dist/views/MinimizedHeader.js +2 -4
  194. package/dist/views/MinimizedHeader.js.map +1 -1
  195. package/dist/views/Stacks.d.ts.map +1 -1
  196. package/dist/views/Stacks.js +23 -28
  197. package/dist/views/Stacks.js.map +1 -1
  198. package/dist/views/Steps/FlowChart/NodeStep.d.ts.map +1 -1
  199. package/dist/views/Steps/FlowChart/NodeStep.js +3 -3
  200. package/dist/views/Steps/FlowChart/NodeStep.js.map +1 -1
  201. package/dist/views/Steps/StepModal.d.ts.map +1 -1
  202. package/dist/views/Steps/StepModal.js +4 -6
  203. package/dist/views/Steps/StepModal.js.map +1 -1
  204. package/dist/views/Steps/dictionary.d.ts +1 -1
  205. package/dist/views/Steps/index.d.ts.map +1 -1
  206. package/dist/views/Steps/index.js +3 -4
  207. package/dist/views/Steps/index.js.map +1 -1
  208. package/dist/views/Steps/utils.d.ts +2 -1
  209. package/dist/views/Steps/utils.d.ts.map +1 -1
  210. package/dist/views/Steps/utils.js +8 -8
  211. package/dist/views/Steps/utils.js.map +1 -1
  212. package/dist/views/Tools.js +2 -4
  213. package/dist/views/Tools.js.map +1 -1
  214. package/dist/views/Workspaces/WorkspacesTab.d.ts.map +1 -1
  215. package/dist/views/Workspaces/WorkspacesTab.js +7 -10
  216. package/dist/views/Workspaces/WorkspacesTab.js.map +1 -1
  217. package/dist/views/Workspaces/index.js +4 -2
  218. package/dist/views/Workspaces/index.js.map +1 -1
  219. package/package.json +12 -13
  220. package/src/StackspotAIWidget.tsx +36 -34
  221. package/src/app-metadata.json +13 -17
  222. package/src/chat-interceptors/quick-commands.ts +5 -11
  223. package/src/components/AdaptiveTextArea.tsx +1 -1
  224. package/src/components/AgentCard/AgentCardCreate.tsx +4 -7
  225. package/src/components/AgentCard/index.tsx +7 -7
  226. package/src/components/ButtonFavorite.tsx +20 -47
  227. package/src/components/Code.tsx +31 -36
  228. package/src/components/ComponentNavigator.tsx +4 -8
  229. package/src/components/FadingOverflow.tsx +6 -7
  230. package/src/components/FileDescription.tsx +14 -11
  231. package/src/components/HistoryList.tsx +1 -1
  232. package/src/components/ListResource.tsx +5 -5
  233. package/src/components/Markdown.tsx +1 -1
  234. package/src/components/Modal.tsx +2 -4
  235. package/src/components/QuickStartButton.tsx +5 -4
  236. package/src/components/RightPanelForm.tsx +20 -13
  237. package/src/components/RightPanelTabs.tsx +4 -32
  238. package/src/components/Selector/index.tsx +17 -13
  239. package/src/components/Selector/styled.ts +8 -5
  240. package/src/components/StackedBadge.tsx +5 -5
  241. package/src/components/TabManager.tsx +28 -54
  242. package/src/components/ToolBadge.tsx +39 -129
  243. package/src/components/WorkspaceTabNavigator.tsx +22 -25
  244. package/src/components/form/DescribedCheckboxGroup.tsx +90 -65
  245. package/src/components/form/DescribedRadioGroup.tsx +79 -46
  246. package/src/index.ts +1 -2
  247. package/src/layout.css +1 -27
  248. package/src/right-panel/DefaultPanel.tsx +3 -7
  249. package/src/state/ChatEntry.ts +3 -4
  250. package/src/state/constants.ts +2 -2
  251. package/src/types.ts +8 -3
  252. package/src/utils/tools.ts +2 -23
  253. package/src/utils/upload/FileUpload.ts +2 -1
  254. package/src/views/Agents/AgentDescription.tsx +6 -7
  255. package/src/views/Agents/AgentsPanel.tsx +11 -12
  256. package/src/views/Agents/AgentsTab.tsx +37 -56
  257. package/src/views/Chat/AgentInfo.tsx +7 -6
  258. package/src/views/Chat/ChatMessage.tsx +109 -118
  259. package/src/views/Chat/StepsList.tsx +10 -11
  260. package/src/views/Chat/styled.ts +8 -2
  261. package/src/views/ChatHistory/HistoryItem.tsx +12 -19
  262. package/src/views/ChatHistory/index.tsx +1 -1
  263. package/src/views/ChatHistory/styled.ts +3 -5
  264. package/src/views/ChatTabSelection.tsx +17 -9
  265. package/src/views/Editor.tsx +9 -14
  266. package/src/views/Home/BuiltInAgent.tsx +7 -8
  267. package/src/views/Home/CustomAgent.tsx +3 -3
  268. package/src/views/Home/index.tsx +2 -2
  269. package/src/views/Home/styled.ts +21 -22
  270. package/src/views/KSDocument.tsx +7 -8
  271. package/src/views/KnowledgeSources.tsx +24 -66
  272. package/src/views/MessageInput/AgentSelector.tsx +10 -8
  273. package/src/views/MessageInput/ButtonAgent.tsx +24 -12
  274. package/src/views/MessageInput/ButtonBar.tsx +25 -21
  275. package/src/views/MessageInput/ContextBar.tsx +17 -14
  276. package/src/views/MessageInput/QuickCommandSelector.tsx +2 -2
  277. package/src/views/MessageInput/SelectContent.tsx +39 -68
  278. package/src/views/MessageInput/UploadBar.tsx +2 -40
  279. package/src/views/MessageInput/UploadDragNDrop.tsx +2 -5
  280. package/src/views/MessageInput/dictionary.ts +0 -4
  281. package/src/views/MessageInput/index.tsx +5 -7
  282. package/src/views/MessageInput/styled.ts +12 -28
  283. package/src/views/MinimizedHeader.tsx +4 -7
  284. package/src/views/Stacks.tsx +31 -54
  285. package/src/views/Steps/FlowChart/NodeStep.tsx +6 -4
  286. package/src/views/Steps/StepModal.tsx +14 -18
  287. package/src/views/Steps/index.tsx +4 -5
  288. package/src/views/Steps/utils.tsx +9 -9
  289. package/src/views/Tools.tsx +12 -19
  290. package/src/views/Workspaces/WorkspacesTab.tsx +17 -21
  291. package/src/views/Workspaces/index.tsx +4 -2
  292. package/dist/components/Accordion.d.ts +0 -20
  293. package/dist/components/Accordion.d.ts.map +0 -1
  294. package/dist/components/Accordion.js +0 -51
  295. package/dist/components/Accordion.js.map +0 -1
  296. package/dist/components/FallbackBoundary/ErrorBoundary.d.ts +0 -33
  297. package/dist/components/FallbackBoundary/ErrorBoundary.d.ts.map +0 -1
  298. package/dist/components/FallbackBoundary/ErrorBoundary.js +0 -52
  299. package/dist/components/FallbackBoundary/ErrorBoundary.js.map +0 -1
  300. package/dist/components/FallbackBoundary/Loading.d.ts +0 -2
  301. package/dist/components/FallbackBoundary/Loading.d.ts.map +0 -1
  302. package/dist/components/FallbackBoundary/Loading.js +0 -12
  303. package/dist/components/FallbackBoundary/Loading.js.map +0 -1
  304. package/dist/components/FallbackBoundary/index.d.ts +0 -17
  305. package/dist/components/FallbackBoundary/index.d.ts.map +0 -1
  306. package/dist/components/FallbackBoundary/index.js +0 -9
  307. package/dist/components/FallbackBoundary/index.js.map +0 -1
  308. package/dist/components/IconInput.d.ts +0 -10
  309. package/dist/components/IconInput.d.ts.map +0 -1
  310. package/dist/components/IconInput.js +0 -61
  311. package/dist/components/IconInput.js.map +0 -1
  312. package/dist/components/OverlayMenu.d.ts +0 -21
  313. package/dist/components/OverlayMenu.d.ts.map +0 -1
  314. package/dist/components/OverlayMenu.js +0 -79
  315. package/dist/components/OverlayMenu.js.map +0 -1
  316. package/dist/components/ProgressBar.d.ts +0 -37
  317. package/dist/components/ProgressBar.d.ts.map +0 -1
  318. package/dist/components/ProgressBar.js +0 -131
  319. package/dist/components/ProgressBar.js.map +0 -1
  320. package/dist/components/Tooltip/Tooltip.d.ts +0 -37
  321. package/dist/components/Tooltip/Tooltip.d.ts.map +0 -1
  322. package/dist/components/Tooltip/Tooltip.js +0 -30
  323. package/dist/components/Tooltip/Tooltip.js.map +0 -1
  324. package/dist/components/Tooltip/TooltipAPI.d.ts +0 -29
  325. package/dist/components/Tooltip/TooltipAPI.d.ts.map +0 -1
  326. package/dist/components/Tooltip/TooltipAPI.js +0 -107
  327. package/dist/components/Tooltip/TooltipAPI.js.map +0 -1
  328. package/dist/components/Tooltip/context.d.ts +0 -5
  329. package/dist/components/Tooltip/context.d.ts.map +0 -1
  330. package/dist/components/Tooltip/context.js +0 -18
  331. package/dist/components/Tooltip/context.js.map +0 -1
  332. package/dist/components/Tooltip/index.d.ts +0 -3
  333. package/dist/components/Tooltip/index.d.ts.map +0 -1
  334. package/dist/components/Tooltip/index.js +0 -3
  335. package/dist/components/Tooltip/index.js.map +0 -1
  336. package/dist/components/Tooltip/style.d.ts +0 -4
  337. package/dist/components/Tooltip/style.d.ts.map +0 -1
  338. package/dist/components/Tooltip/style.js +0 -22
  339. package/dist/components/Tooltip/style.js.map +0 -1
  340. package/dist/components/Tooltip/types.d.ts +0 -27
  341. package/dist/components/Tooltip/types.d.ts.map +0 -1
  342. package/dist/components/Tooltip/types.js +0 -2
  343. package/dist/components/Tooltip/types.js.map +0 -1
  344. package/src/components/Accordion.tsx +0 -75
  345. package/src/components/FallbackBoundary/ErrorBoundary.tsx +0 -71
  346. package/src/components/FallbackBoundary/Loading.tsx +0 -14
  347. package/src/components/FallbackBoundary/index.tsx +0 -26
  348. package/src/components/IconInput.tsx +0 -73
  349. package/src/components/OverlayMenu.tsx +0 -133
  350. package/src/components/ProgressBar.tsx +0 -183
  351. package/src/components/Tooltip/Tooltip.tsx +0 -78
  352. package/src/components/Tooltip/TooltipAPI.ts +0 -101
  353. package/src/components/Tooltip/context.tsx +0 -24
  354. package/src/components/Tooltip/index.ts +0 -2
  355. package/src/components/Tooltip/style.tsx +0 -24
  356. package/src/components/Tooltip/types.ts +0 -28
@@ -1,122 +1,93 @@
1
- import { Agent, DocumentUpload, KnowledgeSource, Plus, QuickCommand, Spaces, Stack } from '@citric/icons'
2
- import { IconButton } from '@citric/ui'
3
- import { SelectionList } from '@stack-spot/portal-components/SelectionList'
4
- import { useMemo, useState } from 'react'
1
+ import { Icon } from '@stack-spot/citric-icons'
2
+ import { IconButton, ImageButton, MenuAction, MenuOverlay, MenuSection } from '@stack-spot/citric-react'
3
+ import { useMemo } from 'react'
5
4
  import { useCurrentChat, useCurrentChatState, useWidget } from '../../context/hooks'
6
5
  import { useUploadManager } from '../../utils/upload/context'
7
6
  import { useMessageInputDictionary } from './dictionary'
8
7
 
9
- type ChatFeatures = 'workspace' | 'knowledgeSource' | 'stack'
10
- type ChatPanel = 'ks' | 'workspace' | 'stack'
11
-
12
8
  export const SelectContent = () => {
13
9
  const widget = useWidget()
14
- const [visibleMenu, setVisibleMenu] = useState(false)
15
10
  const features = useCurrentChatState('features')
16
11
  const t = useMessageInputDictionary()
17
12
  const uploadManager = useUploadManager()
18
13
  const hasFeatureButtons = features.workspace || features.knowledgeSource || features.stack || features.upload
19
14
  const chat = useCurrentChat()
20
15
 
21
- const itemConfigs = [
16
+ const itemConfigs = useMemo<(MenuAction & { key: keyof typeof features, section: 0 | 1 })[]>(() => ([
22
17
  {
23
- role: 'button',
24
18
  key: 'agent',
19
+ section: 0,
25
20
  label: t.chatAgent,
26
- icon: <Agent />,
21
+ icon: <Icon icon="Agent" />,
27
22
  onClick: (event?: React.MouseEvent) => {
28
23
  event?.stopPropagation()
29
24
  chat.set('nextMessage', '@')
30
25
  },
31
26
  },
32
27
  {
33
- role: 'button',
34
28
  key: 'quickCommands',
29
+ section: 0,
35
30
  label: 'Quick Commands',
36
- icon: <QuickCommand />,
31
+ icon: <Icon icon="QuickCommand" />,
37
32
  onClick: (event?: React.MouseEvent) => {
38
33
  event?.stopPropagation()
39
34
  chat.set('nextMessage', '/')
40
35
  },
41
36
  },
42
37
  {
43
- role: 'button',
44
38
  key: 'knowledgeSource',
39
+ section: 0,
45
40
  label: 'Knowledge Sources',
46
- icon: <KnowledgeSource />,
47
- panel: 'ks',
41
+ icon: <Icon icon="KnowledgeSource" />,
42
+ onClick: () => widget.set('panel', 'ks'),
48
43
  },
49
44
  {
50
- role: 'button',
51
45
  key: 'stack',
46
+ section: 0,
52
47
  label: 'Stacks AI',
53
- icon: <Stack />,
54
- panel: 'stack',
48
+ icon: <Icon icon="Stack" />,
49
+ onClick: () => widget.set('panel', 'stack'),
55
50
  },
56
51
  {
57
- role: 'button',
58
52
  key: 'workspace',
53
+ section: 0,
59
54
  label: 'Spots',
60
- icon: <Spaces />,
61
- panel: 'workspace',
55
+ icon: <Icon icon="Spaces" />,
56
+ onClick: () => widget.set('panel', 'workspace'),
62
57
  },
63
58
  {
64
- role: 'button',
65
59
  key: 'upload',
60
+ section: 1,
66
61
  label: t.upload,
67
62
  onClick: () => uploadManager.open(),
68
63
  className: 'upload-item',
69
- icon: <DocumentUpload />,
64
+ icon: <Icon icon="DocumentUpload" />,
70
65
  },
71
- ]
66
+ ] as const).filter(({ key }) => features[key]), [features, widget])
72
67
 
73
- const listItems = useMemo(() =>
74
- itemConfigs.filter(chatFeatures => features[chatFeatures.key as ChatFeatures])
75
- .map(chatFeatures => ({
76
- label: chatFeatures.label,
77
- icon: chatFeatures.icon,
78
- className: chatFeatures.className,
79
- onClick: chatFeatures.panel ? (() => {
80
- widget.set('panel', chatFeatures.panel as ChatPanel)
81
- setVisibleMenu(false)
82
- }) : chatFeatures.onClick,
83
- role: chatFeatures.role,
84
- })), [features, widget])
68
+ const listItems = useMemo(() => {
69
+ const sections: [MenuSection, MenuSection] = [
70
+ { type: 'section', children: [] },
71
+ { type: 'section', children: [] },
72
+ ]
73
+ itemConfigs.forEach(item => sections[item.section].children.push(item))
74
+ return sections.filter(s => !!s.children.length)
75
+ }, [itemConfigs])
85
76
 
86
77
  if (!hasFeatureButtons) return null
87
78
 
88
- return listItems.length > 1 ? (
89
- <>
90
- <IconButton
91
- id="button-content-select"
92
- color="light"
93
- appearance="square"
94
- title={t.chatViewMenu}
95
- data-test-hint="button-options"
96
- aria-label={t.chatViewMenu}
97
- aria-controls="chatMessageMenu"
98
- aria-expanded={visibleMenu}
99
- onClick={() => setVisibleMenu(state => !state)}>
100
- <Plus />
101
- </IconButton>
102
- <SelectionList
103
- className="message-menu"
104
- id="chatMessageMenu"
105
- visible={visibleMenu}
106
- onHide={() => setVisibleMenu(false)}
107
- items={listItems}
108
- aria-label={t.chatViewMenu}
109
- />
110
- </>
79
+ return itemConfigs.length > 1 ? (
80
+ <MenuOverlay items={listItems} position="top" bgLevel={500} spaced roundedItems>
81
+ <IconButton icon="Plus" />
82
+ </MenuOverlay>
111
83
  ) : (
112
- <IconButton
113
- color="light"
84
+ <ImageButton
114
85
  appearance="square"
115
- role="button"
116
- title={listItems[0].label}
117
- aria-label={listItems[0].label}
118
- onClick={listItems[0].onClick}>
119
- {listItems[0].icon}
120
- </IconButton>
86
+ title={`${itemConfigs[0].label}`}
87
+ aria-label={`${itemConfigs[0].label}`}
88
+ onClick={itemConfigs[0].onClick}
89
+ >
90
+ {itemConfigs[0].icon}
91
+ </ImageButton>
121
92
  )
122
93
  }
@@ -1,6 +1,6 @@
1
1
  import { listToClass } from '@stack-spot/portal-theme'
2
2
  import { interpolate } from '@stack-spot/portal-translate'
3
- import { useEffect, useMemo, useRef, useState } from 'react'
3
+ import { useMemo } from 'react'
4
4
  import { FadingOverflow } from '../../components/FadingOverflow'
5
5
  import { FileDescription } from '../../components/FileDescription'
6
6
  import { useCurrentChat } from '../../context/hooks'
@@ -22,7 +22,6 @@ const UploadItem = ({ upload }: UploadedFileProps) => {
22
22
  const uploadManager = useUploadManager()
23
23
  const icon = upload.file.type.toLowerCase().startsWith('image/') ? createImageFromFile(upload.file) : undefined
24
24
  const status = useUploadStatus(upload)
25
-
26
25
  return <FileDescription
27
26
  fileName={upload.file.name}
28
27
  icon={icon}
@@ -38,29 +37,6 @@ export const UploadBar = () => {
38
37
  const t = useMessageInputDictionary()
39
38
  const chat = useCurrentChat()
40
39
  const visible = !!uploads.length
41
- const [ariaMessage, setAriaMessage] = useState('')
42
- const prevUploadsRef = useRef<FileUpload[]>([])
43
- const announcedUploadsRef = useRef(new Set())
44
-
45
- useEffect(() => {
46
- const prevUploads = prevUploadsRef.current
47
- const newUploads = uploads.filter(
48
- up => !prevUploads.some(prev => prev.id === up.id),
49
- )
50
- newUploads.forEach((up) => {
51
- if (!announcedUploadsRef.current.has(up.id)) {
52
- setAriaMessage('')
53
- setTimeout(() => {
54
- setAriaMessage(`${t.uploadSuccessStatus}: ${up.file.name}`)
55
- setTimeout(() => setAriaMessage(''), 2500)
56
- }, 100)
57
- announcedUploadsRef.current.add(up.id)
58
- }
59
- })
60
- if (uploads.some(up => up.status === 'error')) {
61
- setTimeout(() => setAriaMessage(''), 2000)
62
- }
63
- }, [uploads])
64
40
 
65
41
  useUploadErrorEffect((errors) => {
66
42
  const sizeErrors = errors.filter(e => e instanceof FileIsTooLarge)
@@ -77,25 +53,11 @@ export const UploadBar = () => {
77
53
  lines.push(`${interpolate(t.uploadItemLimitError, maxItems)}\n- ${maxItemsErrorsNames.join('\n- ')}`)
78
54
  }
79
55
  if (!lines.length) return
80
- setAriaMessage(lines.join(' '))
81
- setTimeout(() => setAriaMessage(''), 2000)
82
56
  chat.pushMessage(new ChatEntry({ agentType: 'system', type: 'md', content: lines.join('\n\n') }))
83
-
84
- if (lines.length) {
85
- setAriaMessage(lines.join(' '))
86
- setTimeout(() => setAriaMessage(''), 2000)
87
- chat.pushMessage(new ChatEntry({ agentType: 'system', type: 'md', content: lines.join('\n\n') }))
88
- }
89
57
  })
90
-
58
+
91
59
  return (
92
60
  <div className={listToClass(['info-bar', 'upload-bar', visible && 'visible'])}>
93
- <div className="aria-live"
94
- aria-live="polite"
95
- aria-atomic="true"
96
- >
97
- {ariaMessage}
98
- </div>
99
61
  <div className="space"></div>
100
62
  <div className="content">
101
63
  <FadingOverflow className="list-overflow" scroll="arrows" enableHorizontalScrollWithVerticalWheel>
@@ -1,5 +1,4 @@
1
- import { IconBox } from '@citric/core'
2
- import { Document } from '@citric/icons'
1
+ import { Icon } from '@stack-spot/citric-icons'
3
2
  import { DragEvent, useCallback, useEffect, useState } from 'react'
4
3
  import { useCurrentChat } from '../../context/hooks'
5
4
  import { useMessageInputDictionary } from './dictionary'
@@ -72,9 +71,7 @@ export const UploadDragNDrop = ({ isDragging, onDrop, onDragLeave }: UploadDragN
72
71
  e.stopPropagation()
73
72
  }}
74
73
  >
75
- <IconBox size="lg" aria-hidden={true}>
76
- <Document />
77
- </IconBox>
74
+ <Icon icon="Document" size="lg" aria-hidden={true} />
78
75
  <h2 id="upload-drag-drop-title">{t.uploadDragDropTitle}</h2>
79
76
  <p id="upload-drag-drop-description">{t.uploadDragDropDescription}</p>
80
77
  </div>
@@ -33,8 +33,6 @@ const dictionary = {
33
33
  cantSendBecauseOfEmptyContent: 'You can\'t send empty messages. Please write some text or upload a file.',
34
34
  cantSendBecausePromptMaxLength: 'You can\'t send messages longer than $0 characters. Please, shorten your message.',
35
35
  chatAgent: 'Agents',
36
- uploadSuccessStatus: 'File sent successfully',
37
- chatViewMenu: 'Chat options menu',
38
36
  },
39
37
  pt: {
40
38
  stack: 'Selecionar stack',
@@ -68,8 +66,6 @@ const dictionary = {
68
66
  cantSendBecauseOfEmptyContent: 'Não é possível enviar mensagens vazias. Por favor, escreva algum texto ou envie um arquivo.',
69
67
  cantSendBecausePromptMaxLength: 'Você não pode enviar mensagens com mais de $0 caracteres. Por favor, reduza sua mensagem.',
70
68
  chatAgent: 'Agentes',
71
- uploadSuccessStatus: 'Arquivo anexado com sucesso',
72
- chatViewMenu: 'Menu de opções do chat',
73
69
  },
74
70
  } satisfies Dictionary
75
71
 
@@ -1,8 +1,7 @@
1
- import { listToClass, theme } from '@stack-spot/portal-theme'
1
+ import { ProgressBar } from '@stack-spot/citric-react'
2
2
  import { interpolate } from '@stack-spot/portal-translate'
3
3
  import { useCallback, useEffect, useRef, useState } from 'react'
4
4
  import { AdaptiveTextArea } from '../../components/AdaptiveTextArea'
5
- import { ProgressBar } from '../../components/ProgressBar'
6
5
  import { useCurrentChat, useCurrentChatState, useWidgetState } from '../../context/hooks'
7
6
  import { quickCommandRegex } from '../../regex'
8
7
  import { ChatEntry } from '../../state/ChatEntry'
@@ -137,11 +136,11 @@ export const MessageInput = ({ chatWindowRef }: { chatWindowRef?: React.RefObjec
137
136
 
138
137
  return (
139
138
  <UploadProvider value={chat.uploadManager}>
140
- <MessageInputBox aria-busy={isLoading} className="message-input" $inputFocused={focused}>
139
+ <MessageInputBox aria-busy={isLoading} className="message-input">
141
140
  <div className="wrapper-action">
142
141
  <QuickCommandSelector inputRef={textAreaRef} isTrial={isTrial} />
143
142
  <AgentSelector inputRef={textAreaRef} isTrial={isTrial} />
144
- <div className={listToClass(['action-box', focused && 'focused', isLoading && 'disabled'])}>
143
+ <div className="action-box">
145
144
  <ButtonAgent />
146
145
  <AdaptiveTextArea
147
146
  maxHeight={() => isMinimized
@@ -154,7 +153,7 @@ export const MessageInput = ({ chatWindowRef }: { chatWindowRef?: React.RefObjec
154
153
  ? interpolate(t.placeholder, agentLabel)
155
154
  : t.typing
156
155
  }
157
- onChange={e => chat.set('nextMessage', e.target.value)}
156
+ onChange={v => chat.set('nextMessage', v)}
158
157
  value={value}
159
158
  onFocus={() => setFocused(true)}
160
159
  onBlur={() => setFocused(false)}
@@ -165,8 +164,7 @@ export const MessageInput = ({ chatWindowRef }: { chatWindowRef?: React.RefObjec
165
164
  />
166
165
  </div>
167
166
  </div>
168
- <ProgressBar visible={true} animate={isLoading}
169
- backgroundColor={isLoading || !focused ? theme.color.light[500] : theme.color.primary[500]} />
167
+ <ProgressBar progress={isLoading ? undefined : (focused ? 100 : 0)} speed="fast" />
170
168
  <ContextBar />
171
169
  {chat.get('features').upload && <UploadBar />}
172
170
  <ButtonBar onSend={onSend} isLoading={isLoading} />
@@ -1,4 +1,3 @@
1
- import { IconButton } from '@citric/ui'
2
1
  import { theme } from '@stack-spot/portal-theme'
3
2
  import { styled } from 'styled-components'
4
3
 
@@ -51,7 +50,7 @@ export const SelectionBarWrapper = styled.div`
51
50
  }
52
51
  `
53
52
 
54
- export const MessageInputBox = styled.div<{$inputFocused?: boolean}>`
53
+ export const MessageInputBox = styled.div`
55
54
  display: flex;
56
55
  flex-direction: column;
57
56
 
@@ -65,18 +64,6 @@ export const MessageInputBox = styled.div<{$inputFocused?: boolean}>`
65
64
  }
66
65
  }
67
66
 
68
- > .aria-live {
69
- position: absolute;
70
- width: 1;
71
- height: 1;
72
- margin: -1;
73
- padding: 0;
74
- overflow: hidden;
75
- clip: rect(0 0 0 0);
76
- white-Space: nowrap;
77
- border: 0;
78
- }
79
-
80
67
  > .space {
81
68
  height: 0;
82
69
  transition: height 0.4s;
@@ -127,7 +114,7 @@ export const MessageInputBox = styled.div<{$inputFocused?: boolean}>`
127
114
  line-height: 0.75rem;
128
115
  white-space: nowrap;
129
116
 
130
- ${IconButton} {
117
+ /* $ {IconButton} {
131
118
  padding: 4px 0;
132
119
  background: none;
133
120
  border: none;
@@ -138,7 +125,7 @@ export const MessageInputBox = styled.div<{$inputFocused?: boolean}>`
138
125
  width: auto;
139
126
  height: 12px;
140
127
  }
141
- }
128
+ } */
142
129
  }
143
130
  }
144
131
 
@@ -175,18 +162,15 @@ export const MessageInputBox = styled.div<{$inputFocused?: boolean}>`
175
162
  background-color: ${theme.color.light[300]};
176
163
  padding: 10px 8px;
177
164
  transition: border-color 0.3s, background-color 0.3s;
178
-
179
- &.focused {
180
- border: 2px solid ${theme.color.light[300]};
181
- }
182
-
183
-
184
- &.disabled {
185
- background-color: ${theme.color.light[300]};
186
- }
187
165
  }
188
166
  }
189
167
 
168
+ [data-citric="progress-bar"] {
169
+ background-color: ${theme.color.light[500]};
170
+ border: 0;
171
+ padding: 0;
172
+ }
173
+
190
174
  .button-group {
191
175
  display: flex;
192
176
  flex-direction: row;
@@ -239,10 +223,10 @@ export const MessageInputBox = styled.div<{$inputFocused?: boolean}>`
239
223
  }
240
224
  }
241
225
 
242
- ${IconButton} {
226
+ /* $ {IconButton} {
243
227
  width: 24px;
244
228
  height: 24px;
245
- }
229
+ } */
246
230
 
247
231
  .group-agent {
248
232
  display: flex;
@@ -302,7 +286,7 @@ export const MessageInputBox = styled.div<{$inputFocused?: boolean}>`
302
286
  transition: height 0.3s;
303
287
  background-color: transparent;
304
288
  &:focus {
305
- box-shadow: none;
289
+ box-shadow: none !important;
306
290
  }
307
291
  }
308
292
  `
@@ -1,6 +1,4 @@
1
- import { Text } from '@citric/core'
2
- import { ChevronDown, Times } from '@citric/icons'
3
- import { IconButton } from '@citric/ui'
1
+ import { IconButton, Text } from '@stack-spot/citric-react'
4
2
  import { listToClass } from '@stack-spot/portal-theme'
5
3
  import { Dictionary, useTranslate } from '@stack-spot/portal-translate'
6
4
  import { useCallback, useRef, useState } from 'react'
@@ -69,14 +67,13 @@ export const MinimizedHeader = ({ onClose, onCollapse, onExpand }: MinimizedActi
69
67
  <FadingOverflow className="title"><Text title={label}>{label}</Text></FadingOverflow>
70
68
  {showButtons && <div className="button-group">
71
69
  {(onExpand || onCollapse) && <IconButton
70
+ icon="ChevronDown"
72
71
  title={collapsed ? t.expand : t.collapse}
73
72
  aria-label={collapsed ? t.expand : t.collapse}
74
73
  className={listToClass(['collapse', collapsed && 'collapsed'])}
75
74
  onClick={toggleCollapsed}
76
- >
77
- <ChevronDown />
78
- </IconButton>}
79
- {onClose && <IconButton title={t.close} aria-label={t.close} onClick={onClose}><Times /></IconButton>}
75
+ />}
76
+ {onClose && <IconButton icon="Times" title={t.close} aria-label={t.close} onClick={onClose} />}
80
77
  </div>}
81
78
  </Header>
82
79
  )
@@ -1,15 +1,12 @@
1
- import { Button } from '@citric/core'
2
- import { Search } from '@citric/icons'
1
+ import { Button, Tab } from '@stack-spot/citric-react'
3
2
  import { Placeholder } from '@stack-spot/portal-components/Placeholder'
4
3
  import { aiClient, workspaceAiClient } from '@stack-spot/portal-network'
5
- import { GetAiStackResponse, VisibilityLevelEnum } from '@stack-spot/portal-network/api/ai'
4
+ import { VisibilityLevelEnum } from '@stack-spot/portal-network/api/ai'
6
5
  import { WorkspaceResponse } from '@stack-spot/portal-network/api/workspace-ai'
7
6
  import { Dictionary, useTranslate } from '@stack-spot/portal-translate'
8
- import { ReactElement, useCallback, useEffect, useMemo, useRef, useState } from 'react'
9
- import { ButtonFavorite } from '../components/ButtonFavorite'
7
+ import { useEffect, useMemo, useRef, useState } from 'react'
10
8
  import { NavigationComponent } from '../components/ComponentNavigator'
11
9
  import { DescribedRadioGroup } from '../components/form/DescribedRadioGroup'
12
- import { IconInput } from '../components/IconInput'
13
10
  import { RightPanelContentList } from '../components/RightPanelContentList'
14
11
  import { RightPanelTabs } from '../components/RightPanelTabs'
15
12
  import { WorkspaceTabNavigator } from '../components/WorkspaceTabNavigator'
@@ -19,8 +16,6 @@ import { useRightPanel } from '../right-panel/hooks'
19
16
  import { ChatProperties } from '../state/ChatState'
20
17
  import { checkIsTrial } from '../utils/check-is-trial'
21
18
 
22
- type TabElement = { title: string, content: ReactElement }
23
-
24
19
  /**
25
20
  * Renders the Stack selection form in the Right Panel if this is the panel that is currently opened.
26
21
  */
@@ -54,12 +49,12 @@ const StacksPanel = () => {
54
49
  stack.current = chat.get('stack')
55
50
  }, [chat])
56
51
 
57
- const allTabsMap: Partial<Record<Scope, TabElement>> = {
58
- favorite: { title: t.favorites, content: <StacksTab key="favorites" visibility="favorite" stack={stack} /> },
59
- personal: { title: t.personal, content: <StacksTab key="personal" visibility="personal" stack={stack} /> },
60
- shared: { title: t.shared, content: <StacksTab key="shared" visibility="shared" stack={stack} /> },
61
- workspace: { title: t.spots, content: <StacksTabWorkspace key="workspace" visibility="workspace" stack={stack} /> },
62
- account: { title: t.account, content: <StacksTab key="account" visibility="account" stack={stack} /> },
52
+ const allTabsMap: Partial<Record<Scope, Omit<Tab, 'key'>>> = {
53
+ favorite: { label: t.favorites, content: <StacksTab key="favorites" visibility="favorite" stack={stack} /> },
54
+ personal: { label: t.personal, content: <StacksTab key="personal" visibility="personal" stack={stack} /> },
55
+ shared: { label: t.shared, content: <StacksTab key="shared" visibility="shared" stack={stack} /> },
56
+ workspace: { label: t.spots, content: <StacksTabWorkspace key="workspace" visibility="workspace" stack={stack} /> },
57
+ account: { label: t.account, content: <StacksTab key="account" visibility="account" stack={stack} /> },
63
58
  }
64
59
  const defaultScopes: Scope[] = ['favorite', 'personal', 'shared', 'workspace', 'account']
65
60
 
@@ -70,8 +65,8 @@ const StacksPanel = () => {
70
65
  : rawScopes
71
66
 
72
67
  const tabs = scopesToRender
73
- .map(scope => allTabsMap[scope])
74
- .filter(Boolean) as TabElement[]
68
+ .map(scope => scope in allTabsMap ? { key: scope, ...allTabsMap[scope] } : undefined)
69
+ .filter(Boolean) as Tab[]
75
70
 
76
71
  return (isGroupResourcesByScope ? (
77
72
  <RightPanelTabs key={chat.id} tabs={tabs} />
@@ -91,11 +86,10 @@ export const StacksTab = ({ visibility, workspaceId, stack, showSubmitButton = t
91
86
  const t = useTranslate(dictionary)
92
87
  const { close } = useRightPanel()
93
88
  const chat = useCurrentChat()
94
- const [filter, setFilter] = useState('')
95
-
96
89
  const listFavorites = aiClient.aiStacks.useQuery({ visibility: 'favorite' })
97
90
  const [addFavorite, pendingAddFav] = aiClient.addFavoriteStackAi.useMutation()
98
91
  const [removeFavorite, pendingRemoveFav] = aiClient.removeFavoriteStackAi.useMutation()
92
+ const [submitEnabled, setSubmitEnabled] = useState(false)
99
93
 
100
94
  const removeFavoriteStack = async (idOrSlug: string) => {
101
95
  try {
@@ -146,57 +140,40 @@ export const StacksTab = ({ visibility, workspaceId, stack, showSubmitButton = t
146
140
  reject(error)
147
141
  }
148
142
  })
149
-
150
-
151
143
 
152
144
  const stacks = workspaceId
153
145
  ? workspaceAiClient.getStackFromWorkspaceAi.useQuery({ workspaceId })
154
146
  //@ts-ignore
155
147
  : aiClient.aiStacks.useQuery({ visibility, order: 'a-to-z' })
156
148
 
157
- const currentStackId = stack.current ? stack.current.id : chat.get('stack')?.id
158
- const [value, setValue] = useState<GetAiStackResponse | undefined>(stacks.find(s => s.id === currentStackId))
159
- const filtered = useMemo(() => filter ?
160
- // Recreate the list so that the favorites list is taken into account
161
- stacks.filter(s => s === value || s.name.toLocaleLowerCase().includes(filter.toLocaleLowerCase())) : [...stacks],
162
- [stacks, listFavorites, filter, value],
163
- )
149
+ const initialValue = useMemo(() => {
150
+ const currentStackId = stack.current ? stack.current.id : chat.get('stack')?.id
151
+ const initial = stacks.find(s => s.id === currentStackId)
152
+ if (initial) setSubmitEnabled(true)
153
+ return initial
154
+ }, [stacks])
164
155
 
165
156
  function submit() {
166
- if (value) chat.set('stack', { id: value.id, label: value.name })
157
+ if (stack.current) chat.set('stack', stack.current)
167
158
  close()
168
159
  }
169
160
 
170
- const onChange = useCallback((newValue: GetAiStackResponse) => {
171
- setValue(newValue)
172
- stack.current = { ...newValue, label: newValue.name }
173
- }, [])
174
-
175
161
  return (
176
162
  <>
177
163
  <div className="content">
178
- <IconInput icon={<Search />} value={filter} onChange={setFilter} className="search" />
179
- {!!filtered.length && <DescribedRadioGroup
180
- options={filtered}
181
- renderAfterElement={({ id }) =>
182
- <ButtonFavorite favorite={{ idOrSlug:id, listFavorites, onAddFavorite, onRemoveFavorite }} />
183
- }
184
- keygen={s => s.id}
185
- value={value}
186
- onChange={onChange}
187
- renderLabel={s => s.name}
188
- renderDescription={s => s.use_case}
189
- optionClassName={s => (s === value && filter && !s.name.toLocaleLowerCase().includes(filter.toLocaleLowerCase()))
190
- ? 'filtered-out'
191
- : ''
192
- }
193
- className="option-list"
194
- />}
195
- {!!stacks.length && !filtered.length &&
196
- <Placeholder title={t.noSearchResults} description={t.noSearchResultsDescription} className="no-data-placeholder"/>}
197
- {!stacks.length && <Placeholder title={t.noData} description={t.noDataDescription} />}
164
+ <DescribedRadioGroup
165
+ options={stacks}
166
+ initialValue={initialValue}
167
+ data={s => ({ idOrSlug: s.id, description: s.use_case, name: s.name, listFavorites, onAddFavorite, onRemoveFavorite })}
168
+ emptyResults={<Placeholder title={t.noSearchResults} description={t.noSearchResultsDescription} className="no-data-placeholder"/>}
169
+ emptyDataset={<Placeholder title={t.noData} description={t.noDataDescription} />}
170
+ onChange={(s) => {
171
+ stack.current = s ? { ...s, label: s.name } : undefined
172
+ setSubmitEnabled(true)
173
+ }}
174
+ />
198
175
  </div>
199
- {!!filtered.length && showSubmitButton && <Button onClick={submit} disabled={!value}>{t.apply}</Button>}
176
+ {!!stacks.length && showSubmitButton && <Button onClick={submit} disabled={!submitEnabled}>{t.apply}</Button>}
200
177
  </>
201
178
  )
202
179
  }
@@ -1,5 +1,5 @@
1
- import { IconBox, Text } from '@citric/core'
2
- import { Cog } from '@citric/icons'
1
+ import { Icon } from '@stack-spot/citric-icons'
2
+ import { Text } from '@stack-spot/citric-react'
3
3
  import { listToClass } from '@stack-spot/portal-theme'
4
4
  import { StackedBadge } from '../../../components/StackedBadge'
5
5
  import { useStepsDictionary } from '../dictionary'
@@ -24,7 +24,7 @@ export const NodeStep = ({ data: { step, index, nextStatus, onClick } }: Props)
24
24
  aria-label={getTitle(t, step, index)}
25
25
  >
26
26
  <header>
27
- <IconBox>{getTypeIcon(step.type)}</IconBox>
27
+ <Icon {...getTypeIcon(step.type)} />
28
28
  <Text className="step-index">{getTitle(t, step, index)}</Text>
29
29
  {getStatusIcon(step.status)}
30
30
  </header>
@@ -36,7 +36,9 @@ export const NodeStep = ({ data: { step, index, nextStatus, onClick } }: Props)
36
36
  </Text>
37
37
  {!!step.attempts[0].tools?.length && <StackedBadge
38
38
  label={t.tools}
39
- images={step.attempts[0].tools?.slice(0, 3).map(tool => ({ key: tool.id, name: tool.name, url: tool.image, icon: <Cog /> }))}
39
+ images={step.attempts[0].tools?.slice(0, 3).map(
40
+ tool => ({ key: tool.id, name: tool.name, url: tool.image, icon: <Icon icon="Cog" /> }),
41
+ )}
40
42
  />}
41
43
  </div>}
42
44
  <HandleGroup renderSource={step.type !== 'answer'} renderTarget={step.type !== 'planning'} />