@patternfly/chatbot 6.5.0-prerelease.3 → 6.5.0-prerelease.30

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 (351) hide show
  1. package/dist/cjs/AttachMenu/AttachMenu.d.ts +8 -2
  2. package/dist/cjs/AttachMenu/AttachMenu.js +2 -2
  3. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +9 -1
  4. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -2
  5. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +38 -0
  6. package/dist/cjs/ChatbotFooter/ChatbotFooter.d.ts +5 -2
  7. package/dist/cjs/ChatbotFooter/ChatbotFooter.js +2 -2
  8. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +5 -1
  9. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +29 -2
  10. package/dist/cjs/CodeModal/CodeModal.d.ts +2 -0
  11. package/dist/cjs/CodeModal/CodeModal.js +53 -8
  12. package/dist/cjs/DeepThinking/DeepThinking.d.ts +13 -0
  13. package/dist/cjs/DeepThinking/DeepThinking.js +31 -3
  14. package/dist/cjs/DeepThinking/DeepThinking.test.js +80 -0
  15. package/dist/cjs/FileDetailsLabel/FileDetailsLabel.d.ts +2 -1
  16. package/dist/cjs/MarkdownContent/MarkdownContent.d.ts +44 -0
  17. package/dist/cjs/MarkdownContent/MarkdownContent.js +181 -0
  18. package/dist/cjs/MarkdownContent/MarkdownContent.test.d.ts +1 -0
  19. package/dist/cjs/MarkdownContent/MarkdownContent.test.js +192 -0
  20. package/dist/cjs/MarkdownContent/index.d.ts +2 -0
  21. package/dist/cjs/MarkdownContent/index.js +23 -0
  22. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.d.ts +5 -1
  23. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.js +16 -5
  24. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +1 -0
  25. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.js +131 -0
  26. package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
  27. package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +5 -3
  28. package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
  29. package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.js +30 -0
  30. package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +5 -1
  31. package/dist/cjs/Message/LinkMessage/LinkMessage.js +4 -3
  32. package/dist/cjs/Message/ListMessage/OrderedListMessage.d.ts +9 -1
  33. package/dist/cjs/Message/ListMessage/OrderedListMessage.js +2 -1
  34. package/dist/cjs/Message/ListMessage/UnorderedListMessage.d.ts +7 -1
  35. package/dist/cjs/Message/ListMessage/UnorderedListMessage.js +2 -1
  36. package/dist/cjs/Message/Message.d.ts +22 -3
  37. package/dist/cjs/Message/Message.js +8 -161
  38. package/dist/cjs/Message/Message.test.js +161 -2
  39. package/dist/cjs/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
  40. package/dist/cjs/Message/MessageAndActions/MessageAndActions.js +22 -0
  41. package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
  42. package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.js +25 -0
  43. package/dist/cjs/Message/MessageAndActions/index.d.ts +1 -0
  44. package/dist/cjs/Message/MessageAndActions/index.js +17 -0
  45. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
  46. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.js +22 -0
  47. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
  48. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.js +25 -0
  49. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
  50. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.js +22 -0
  51. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
  52. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.js +25 -0
  53. package/dist/cjs/Message/MessageAttachments/index.d.ts +2 -0
  54. package/dist/cjs/Message/MessageAttachments/index.js +18 -0
  55. package/dist/cjs/Message/MessageInput.d.ts +1 -1
  56. package/dist/cjs/Message/MessageInput.js +3 -1
  57. package/dist/cjs/Message/MessageLoading.d.ts +13 -3
  58. package/dist/cjs/Message/MessageLoading.js +19 -5
  59. package/dist/cjs/Message/MessageLoading.test.d.ts +1 -0
  60. package/dist/cjs/Message/MessageLoading.test.js +25 -0
  61. package/dist/cjs/Message/QuickResponse/QuickResponse.js +3 -2
  62. package/dist/cjs/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
  63. package/dist/cjs/Message/QuickResponse/QuickResponse.test.js +109 -0
  64. package/dist/cjs/Message/QuickResponse/index.d.ts +1 -0
  65. package/dist/cjs/Message/QuickResponse/index.js +17 -0
  66. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +1 -1
  67. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +3 -2
  68. package/dist/cjs/Message/QuickStarts/index.d.ts +2 -0
  69. package/dist/cjs/Message/QuickStarts/index.js +18 -0
  70. package/dist/cjs/Message/TableMessage/TableMessage.d.ts +9 -1
  71. package/dist/cjs/Message/TableMessage/TableMessage.js +3 -2
  72. package/dist/cjs/Message/TextMessage/TextMessage.d.ts +11 -1
  73. package/dist/cjs/Message/TextMessage/TextMessage.js +3 -2
  74. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +3 -1
  75. package/dist/cjs/Message/UserFeedback/UserFeedback.js +8 -6
  76. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
  77. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +3 -2
  78. package/dist/cjs/Message/UserFeedback/index.d.ts +2 -0
  79. package/dist/cjs/Message/UserFeedback/index.js +18 -0
  80. package/dist/cjs/Message/index.d.ts +8 -0
  81. package/dist/cjs/Message/index.js +8 -0
  82. package/dist/cjs/MessageBar/AttachButton.d.ts +2 -0
  83. package/dist/cjs/MessageBar/AttachButton.js +2 -2
  84. package/dist/cjs/MessageBar/AttachButton.test.js +4 -0
  85. package/dist/cjs/MessageBar/MessageBar.d.ts +22 -6
  86. package/dist/cjs/MessageBar/MessageBar.js +43 -11
  87. package/dist/cjs/MessageBar/MessageBar.test.js +74 -0
  88. package/dist/cjs/Onboarding/Onboarding.d.ts +36 -0
  89. package/dist/cjs/Onboarding/Onboarding.js +37 -0
  90. package/dist/cjs/Onboarding/Onboarding.test.d.ts +1 -0
  91. package/dist/cjs/Onboarding/Onboarding.test.js +80 -0
  92. package/dist/cjs/Onboarding/index.d.ts +2 -0
  93. package/dist/cjs/Onboarding/index.js +23 -0
  94. package/dist/cjs/ResponseActions/ResponseActions.d.ts +7 -0
  95. package/dist/cjs/ResponseActions/ResponseActions.js +28 -7
  96. package/dist/cjs/ResponseActions/ResponseActions.test.js +67 -12
  97. package/dist/cjs/ResponseActions/ResponseActionsGroups.d.ts +13 -0
  98. package/dist/cjs/ResponseActions/ResponseActionsGroups.js +22 -0
  99. package/dist/cjs/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
  100. package/dist/cjs/ResponseActions/ResponseActionsGroups.test.js +25 -0
  101. package/dist/cjs/ResponseActions/index.d.ts +1 -0
  102. package/dist/cjs/ResponseActions/index.js +1 -0
  103. package/dist/cjs/ToolCall/ToolCall.d.ts +11 -0
  104. package/dist/cjs/ToolCall/ToolCall.js +24 -3
  105. package/dist/cjs/ToolCall/ToolCall.test.js +57 -0
  106. package/dist/cjs/ToolResponse/ToolResponse.d.ts +17 -0
  107. package/dist/cjs/ToolResponse/ToolResponse.js +49 -3
  108. package/dist/cjs/ToolResponse/ToolResponse.test.js +100 -0
  109. package/dist/cjs/__mocks__/monaco-editor.d.ts +11 -0
  110. package/dist/cjs/__mocks__/monaco-editor.js +18 -0
  111. package/dist/cjs/index.d.ts +4 -0
  112. package/dist/cjs/index.js +7 -1
  113. package/dist/css/main.css +336 -30
  114. package/dist/css/main.css.map +1 -1
  115. package/dist/dynamic/MarkdownContent/package.json +1 -0
  116. package/dist/dynamic/Onboarding/package.json +1 -0
  117. package/dist/esm/AttachMenu/AttachMenu.d.ts +8 -2
  118. package/dist/esm/AttachMenu/AttachMenu.js +2 -2
  119. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +9 -1
  120. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +10 -3
  121. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +38 -0
  122. package/dist/esm/ChatbotFooter/ChatbotFooter.d.ts +5 -2
  123. package/dist/esm/ChatbotFooter/ChatbotFooter.js +2 -2
  124. package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +5 -1
  125. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +30 -3
  126. package/dist/esm/CodeModal/CodeModal.d.ts +2 -0
  127. package/dist/esm/CodeModal/CodeModal.js +54 -9
  128. package/dist/esm/DeepThinking/DeepThinking.d.ts +13 -0
  129. package/dist/esm/DeepThinking/DeepThinking.js +28 -3
  130. package/dist/esm/DeepThinking/DeepThinking.test.js +80 -0
  131. package/dist/esm/FileDetailsLabel/FileDetailsLabel.d.ts +2 -1
  132. package/dist/esm/MarkdownContent/MarkdownContent.d.ts +44 -0
  133. package/dist/esm/MarkdownContent/MarkdownContent.js +174 -0
  134. package/dist/esm/MarkdownContent/MarkdownContent.test.d.ts +1 -0
  135. package/dist/esm/MarkdownContent/MarkdownContent.test.js +187 -0
  136. package/dist/esm/MarkdownContent/index.d.ts +2 -0
  137. package/dist/esm/MarkdownContent/index.js +2 -0
  138. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.d.ts +5 -1
  139. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.js +16 -5
  140. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +1 -0
  141. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.js +126 -0
  142. package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
  143. package/dist/esm/Message/ErrorMessage/ErrorMessage.js +3 -3
  144. package/dist/esm/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
  145. package/dist/esm/Message/ErrorMessage/ErrorMessage.test.js +25 -0
  146. package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +5 -1
  147. package/dist/esm/Message/LinkMessage/LinkMessage.js +4 -3
  148. package/dist/esm/Message/ListMessage/OrderedListMessage.d.ts +9 -1
  149. package/dist/esm/Message/ListMessage/OrderedListMessage.js +2 -1
  150. package/dist/esm/Message/ListMessage/UnorderedListMessage.d.ts +7 -1
  151. package/dist/esm/Message/ListMessage/UnorderedListMessage.js +2 -1
  152. package/dist/esm/Message/Message.d.ts +22 -3
  153. package/dist/esm/Message/Message.js +9 -162
  154. package/dist/esm/Message/Message.test.js +161 -2
  155. package/dist/esm/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
  156. package/dist/esm/Message/MessageAndActions/MessageAndActions.js +18 -0
  157. package/dist/esm/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
  158. package/dist/esm/Message/MessageAndActions/MessageAndActions.test.js +20 -0
  159. package/dist/esm/Message/MessageAndActions/index.d.ts +1 -0
  160. package/dist/esm/Message/MessageAndActions/index.js +1 -0
  161. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
  162. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.js +18 -0
  163. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
  164. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.js +20 -0
  165. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
  166. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.js +18 -0
  167. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
  168. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.js +20 -0
  169. package/dist/esm/Message/MessageAttachments/index.d.ts +2 -0
  170. package/dist/esm/Message/MessageAttachments/index.js +2 -0
  171. package/dist/esm/Message/MessageInput.d.ts +1 -1
  172. package/dist/esm/Message/MessageInput.js +1 -1
  173. package/dist/esm/Message/MessageLoading.d.ts +13 -3
  174. package/dist/esm/Message/MessageLoading.js +16 -4
  175. package/dist/esm/Message/MessageLoading.test.d.ts +1 -0
  176. package/dist/esm/Message/MessageLoading.test.js +20 -0
  177. package/dist/esm/Message/QuickResponse/QuickResponse.js +3 -2
  178. package/dist/esm/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
  179. package/dist/esm/Message/QuickResponse/QuickResponse.test.js +104 -0
  180. package/dist/esm/Message/QuickResponse/index.d.ts +1 -0
  181. package/dist/esm/Message/QuickResponse/index.js +1 -0
  182. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +1 -1
  183. package/dist/esm/Message/QuickStarts/QuickStartTile.js +1 -1
  184. package/dist/esm/Message/QuickStarts/index.d.ts +2 -0
  185. package/dist/esm/Message/QuickStarts/index.js +2 -0
  186. package/dist/esm/Message/TableMessage/TableMessage.d.ts +9 -1
  187. package/dist/esm/Message/TableMessage/TableMessage.js +3 -2
  188. package/dist/esm/Message/TextMessage/TextMessage.d.ts +11 -1
  189. package/dist/esm/Message/TextMessage/TextMessage.js +3 -2
  190. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +3 -1
  191. package/dist/esm/Message/UserFeedback/UserFeedback.js +7 -7
  192. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
  193. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +1 -2
  194. package/dist/esm/Message/UserFeedback/index.d.ts +2 -0
  195. package/dist/esm/Message/UserFeedback/index.js +2 -0
  196. package/dist/esm/Message/index.d.ts +8 -0
  197. package/dist/esm/Message/index.js +8 -0
  198. package/dist/esm/MessageBar/AttachButton.d.ts +2 -0
  199. package/dist/esm/MessageBar/AttachButton.js +2 -2
  200. package/dist/esm/MessageBar/AttachButton.test.js +4 -0
  201. package/dist/esm/MessageBar/MessageBar.d.ts +22 -6
  202. package/dist/esm/MessageBar/MessageBar.js +43 -11
  203. package/dist/esm/MessageBar/MessageBar.test.js +74 -0
  204. package/dist/esm/Onboarding/Onboarding.d.ts +36 -0
  205. package/dist/esm/Onboarding/Onboarding.js +30 -0
  206. package/dist/esm/Onboarding/Onboarding.test.d.ts +1 -0
  207. package/dist/esm/Onboarding/Onboarding.test.js +75 -0
  208. package/dist/esm/Onboarding/index.d.ts +2 -0
  209. package/dist/esm/Onboarding/index.js +2 -0
  210. package/dist/esm/ResponseActions/ResponseActions.d.ts +7 -0
  211. package/dist/esm/ResponseActions/ResponseActions.js +28 -7
  212. package/dist/esm/ResponseActions/ResponseActions.test.js +67 -12
  213. package/dist/esm/ResponseActions/ResponseActionsGroups.d.ts +13 -0
  214. package/dist/esm/ResponseActions/ResponseActionsGroups.js +18 -0
  215. package/dist/esm/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
  216. package/dist/esm/ResponseActions/ResponseActionsGroups.test.js +20 -0
  217. package/dist/esm/ResponseActions/index.d.ts +1 -0
  218. package/dist/esm/ResponseActions/index.js +1 -0
  219. package/dist/esm/ToolCall/ToolCall.d.ts +11 -0
  220. package/dist/esm/ToolCall/ToolCall.js +21 -3
  221. package/dist/esm/ToolCall/ToolCall.test.js +57 -0
  222. package/dist/esm/ToolResponse/ToolResponse.d.ts +17 -0
  223. package/dist/esm/ToolResponse/ToolResponse.js +46 -3
  224. package/dist/esm/ToolResponse/ToolResponse.test.js +100 -0
  225. package/dist/esm/__mocks__/monaco-editor.d.ts +11 -0
  226. package/dist/esm/__mocks__/monaco-editor.js +18 -0
  227. package/dist/esm/index.d.ts +4 -0
  228. package/dist/esm/index.js +4 -0
  229. package/dist/tsconfig.tsbuildinfo +1 -1
  230. package/package.json +13 -2
  231. package/patternfly-docs/content/extensions/chatbot/chatbot.md +57 -0
  232. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +12 -12
  233. package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +1 -1
  234. package/patternfly-docs/content/extensions/chatbot/examples/Customizing Messages/Customizing Messages.md +1 -1
  235. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +1 -0
  236. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomStructure.tsx +102 -0
  237. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithDeepThinking.tsx +25 -11
  238. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +14 -1
  239. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownDeepThinking.tsx +26 -0
  240. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownToolCall.tsx +29 -0
  241. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownToolResponse.tsx +200 -0
  242. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMultipleActionGroups.tsx +61 -0
  243. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithPersistedActions.tsx +22 -0
  244. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +11 -0
  245. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolCall.tsx +14 -1
  246. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolResponse.tsx +222 -105
  247. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +123 -14
  248. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +1 -0
  249. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +3 -1
  250. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSearchActions.tsx +198 -0
  251. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarCustomActions.tsx +190 -0
  252. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarIndicatorThinking.tsx +15 -0
  253. package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactOnboarding.tsx +141 -0
  254. package/patternfly-docs/content/extensions/chatbot/examples/UI/Onboarding.tsx +151 -0
  255. package/patternfly-docs/content/extensions/chatbot/examples/UI/RH-Hat-Image.svg +9 -0
  256. package/patternfly-docs/content/extensions/chatbot/examples/UI/Settings.tsx +1 -1
  257. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +81 -30
  258. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +18 -18
  259. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +44 -22
  260. package/patternfly-docs/content/extensions/chatbot/examples/demos/WhiteEmbeddedChatbot.tsx +451 -0
  261. package/patternfly-docs/patternfly-docs.config.js +1 -1
  262. package/patternfly-docs/patternfly-docs.source.js +1 -1
  263. package/src/AttachMenu/AttachMenu.tsx +26 -11
  264. package/src/Chatbot/Chatbot.scss +23 -1
  265. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +43 -0
  266. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +95 -0
  267. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +51 -15
  268. package/src/ChatbotFooter/ChatbotFooter.scss +21 -0
  269. package/src/ChatbotFooter/ChatbotFooter.test.tsx +10 -1
  270. package/src/ChatbotFooter/ChatbotFooter.tsx +10 -3
  271. package/src/ChatbotHeader/ChatbotHeader.scss +19 -0
  272. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +56 -14
  273. package/src/ChatbotModal/ChatbotModal.scss +3 -0
  274. package/src/CodeModal/CodeModal.tsx +72 -23
  275. package/src/DeepThinking/DeepThinking.scss +1 -1
  276. package/src/DeepThinking/DeepThinking.test.tsx +109 -0
  277. package/src/DeepThinking/DeepThinking.tsx +54 -5
  278. package/src/FileDetailsLabel/FileDetailsLabel.tsx +2 -2
  279. package/src/MarkdownContent/MarkdownContent.test.tsx +207 -0
  280. package/src/MarkdownContent/MarkdownContent.tsx +269 -0
  281. package/src/MarkdownContent/index.ts +2 -0
  282. package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +17 -0
  283. package/src/Message/CodeBlockMessage/CodeBlockMessage.test.tsx +171 -0
  284. package/src/Message/CodeBlockMessage/CodeBlockMessage.tsx +21 -5
  285. package/src/Message/ErrorMessage/ErrorMessage.test.tsx +38 -0
  286. package/src/Message/ErrorMessage/ErrorMessage.tsx +17 -2
  287. package/src/Message/LinkMessage/LinkMessage.scss +5 -0
  288. package/src/Message/LinkMessage/LinkMessage.tsx +24 -2
  289. package/src/Message/ListMessage/ListMessage.scss +8 -0
  290. package/src/Message/ListMessage/OrderedListMessage.tsx +16 -2
  291. package/src/Message/ListMessage/UnorderedListMessage.tsx +12 -2
  292. package/src/Message/Message.scss +11 -7
  293. package/src/Message/Message.test.tsx +239 -2
  294. package/src/Message/Message.tsx +133 -241
  295. package/src/Message/MessageAndActions/MessageAndActions.test.tsx +23 -0
  296. package/src/Message/MessageAndActions/MessageAndActions.tsx +22 -0
  297. package/src/Message/MessageAndActions/index.ts +1 -0
  298. package/src/Message/MessageAttachments/MessageAttachmentItem.test.tsx +23 -0
  299. package/src/Message/MessageAttachments/MessageAttachmentItem.tsx +25 -0
  300. package/src/Message/MessageAttachments/MessageAttachmentsContainer.test.tsx +23 -0
  301. package/src/Message/MessageAttachments/MessageAttachmentsContainer.tsx +25 -0
  302. package/src/Message/MessageAttachments/index.ts +2 -0
  303. package/src/Message/MessageInput.tsx +1 -1
  304. package/src/Message/MessageLoading.scss +7 -0
  305. package/src/Message/MessageLoading.test.tsx +23 -0
  306. package/src/Message/MessageLoading.tsx +17 -2
  307. package/src/Message/QuickResponse/QuickResponse.scss +3 -1
  308. package/src/Message/QuickResponse/QuickResponse.test.tsx +131 -0
  309. package/src/Message/QuickResponse/QuickResponse.tsx +3 -2
  310. package/src/Message/QuickResponse/index.ts +1 -0
  311. package/src/Message/QuickStarts/QuickStartTile.tsx +1 -1
  312. package/src/Message/QuickStarts/index.ts +2 -0
  313. package/src/Message/TableMessage/TableMessage.scss +17 -1
  314. package/src/Message/TableMessage/TableMessage.tsx +22 -2
  315. package/src/Message/TextMessage/TextMessage.scss +18 -0
  316. package/src/Message/TextMessage/TextMessage.tsx +39 -3
  317. package/src/Message/UserFeedback/UserFeedback.scss +30 -2
  318. package/src/Message/UserFeedback/UserFeedback.tsx +23 -13
  319. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +1 -4
  320. package/src/Message/UserFeedback/index.ts +2 -0
  321. package/src/Message/index.ts +8 -0
  322. package/src/MessageBar/AttachButton.scss +0 -1
  323. package/src/MessageBar/AttachButton.test.tsx +4 -0
  324. package/src/MessageBar/AttachButton.tsx +4 -1
  325. package/src/MessageBar/MessageBar.scss +66 -6
  326. package/src/MessageBar/MessageBar.test.tsx +129 -1
  327. package/src/MessageBar/MessageBar.tsx +150 -56
  328. package/src/MessageBar/MicrophoneButton.scss +0 -1
  329. package/src/MessageBar/SendButton.scss +0 -1
  330. package/src/MessageBar/StopButton.scss +0 -1
  331. package/src/Onboarding/Onboarding.scss +101 -0
  332. package/src/Onboarding/Onboarding.test.tsx +148 -0
  333. package/src/Onboarding/Onboarding.tsx +126 -0
  334. package/src/Onboarding/index.ts +3 -0
  335. package/src/ResponseActions/ResponseActions.scss +12 -1
  336. package/src/ResponseActions/ResponseActions.test.tsx +111 -12
  337. package/src/ResponseActions/ResponseActions.tsx +44 -10
  338. package/src/ResponseActions/ResponseActionsGroups.test.tsx +23 -0
  339. package/src/ResponseActions/ResponseActionsGroups.tsx +28 -0
  340. package/src/ResponseActions/index.ts +1 -0
  341. package/src/ToolCall/ToolCall.scss +1 -1
  342. package/src/ToolCall/ToolCall.test.tsx +91 -0
  343. package/src/ToolCall/ToolCall.tsx +49 -4
  344. package/src/ToolResponse/ToolResponse.scss +13 -3
  345. package/src/ToolResponse/ToolResponse.test.tsx +119 -0
  346. package/src/ToolResponse/ToolResponse.tsx +82 -7
  347. package/src/__mocks__/monaco-editor.ts +19 -0
  348. package/src/index.ts +6 -0
  349. package/src/main.scss +2 -0
  350. package/tsconfig.json +1 -1
  351. package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +0 -44
@@ -21,17 +21,43 @@
21
21
  justify-content: flex-end;
22
22
  background-color: var(--pf-t--global--background--color--primary--default);
23
23
  border-radius: calc(var(--pf-t--global--border--radius--medium) * 2);
24
- transition: box-shadow var(--pf-t--global--motion--timing-function--accelerate)
24
+ transition: border-color var(--pf-t--global--motion--timing-function--accelerate)
25
25
  var(--pf-t--global--motion--duration--sm);
26
+ position: relative;
27
+ border: var(--pf-t--global--border--width--control--default) solid transparent;
26
28
 
27
29
  overflow: hidden;
28
30
 
31
+ &::after {
32
+ content: '';
33
+ position: absolute;
34
+ inset: 0;
35
+ border-radius: inherit;
36
+ border: var(--pf-t--global--border--width--control--default) solid transparent;
37
+ pointer-events: none;
38
+ transition:
39
+ border-color var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--sm),
40
+ border-width var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--sm);
41
+ }
42
+
43
+ &.pf-m-primary {
44
+ &::after {
45
+ border-color: var(--pf-t--global--border--color--default);
46
+ }
47
+ }
48
+
29
49
  &:hover {
30
- box-shadow: inset 0 0 0 1px var(--pf-t--global--border--color--default);
50
+ &::after {
51
+ border-color: var(--pf-t--global--border--color--default);
52
+ border-width: var(--pf-t--global--border--width--control--hover);
53
+ }
31
54
  }
32
55
 
33
56
  &:focus-within {
34
- box-shadow: inset 0 0 0 2px var(--pf-t--global--color--brand--default);
57
+ &::after {
58
+ border-color: var(--pf-t--global--color--brand--default);
59
+ border-width: var(--pf-t--global--border--width--control--clicked);
60
+ }
35
61
  }
36
62
 
37
63
  &-actions {
@@ -40,6 +66,19 @@
40
66
  padding-block-start: var(--pf-t--global--spacer--xs);
41
67
  padding-block-end: var(--pf-t--global--spacer--xs);
42
68
  gap: var(--pf-t--global--spacer--gap--action-to-action--plain);
69
+
70
+ &.pf-m-grouped {
71
+ flex-basis: 100%;
72
+ justify-content: space-between;
73
+ }
74
+ }
75
+
76
+ &-actions-group {
77
+ display: flex;
78
+ padding-block-start: var(--pf-t--global--spacer--xs);
79
+ padding-block-end: var(--pf-t--global--spacer--xs);
80
+ gap: var(--pf-t--global--spacer--gap--action-to-action--plain);
81
+ align-items: center;
43
82
  }
44
83
 
45
84
  &-input {
@@ -121,9 +160,30 @@
121
160
  .pf-chatbot__message-textarea {
122
161
  font-size: var(--pf-t--global--font--size--sm) !important;
123
162
  }
163
+ }
164
+
165
+ .pf-m-compact {
166
+ .pf-chatbot__message-bar-actions,
167
+ .pf-chatbot__message-bar-actions-group {
168
+ padding-block-start: var(--pf-t--global--spacer--sm);
169
+ padding-block-end: var(--pf-t--global--spacer--sm);
170
+ }
171
+ }
124
172
 
125
- .pf-chatbot__message-bar-actions {
126
- padding-block-start: var(--pf-t--global--spacer--md);
127
- padding-block-end: var(--pf-t--global--spacer--md);
173
+ // ============================================================================
174
+ // Multiline textarea styles (2+ lines)
175
+ // ============================================================================
176
+ .pf-chatbot__message-bar.pf-m-multiline {
177
+ border-radius: calc(var(--pf-t--global--border--radius--small) * 2);
178
+ }
179
+
180
+ // ============================================================================
181
+ // High contrast styles
182
+ // ============================================================================
183
+ :root:where(.pf-v6-theme-high-contrast) {
184
+ .pf-chatbot__message-bar {
185
+ &::after {
186
+ border-color: var(--pf-t--global--border--color--default);
187
+ }
128
188
  }
129
189
  }
@@ -1,5 +1,11 @@
1
1
  import '@testing-library/jest-dom';
2
- import { DropdownGroup, DropdownItem, DropdownList } from '@patternfly/react-core';
2
+ import {
3
+ DropdownGroup,
4
+ DropdownItem,
5
+ DropdownList,
6
+ MenuSearchInputProps,
7
+ MenuSearchProps
8
+ } from '@patternfly/react-core';
3
9
  import { BellIcon, CalendarAltIcon, ClipboardIcon, CodeIcon } from '@patternfly/react-icons';
4
10
  import { render, screen } from '@testing-library/react';
5
11
  import userEvent from '@testing-library/user-event';
@@ -218,6 +224,71 @@ describe('Message bar', () => {
218
224
  await userEvent.click(attachButton);
219
225
  expect(attachToggleClickSpy).toHaveBeenCalledTimes(1);
220
226
  });
227
+ it('can pass searchInputProps to search input in AttachMenu', () => {
228
+ render(
229
+ <MessageBar
230
+ onSendMessage={jest.fn}
231
+ value="test"
232
+ attachMenuProps={{
233
+ isAttachMenuOpen: true,
234
+ setIsAttachMenuOpen: jest.fn(),
235
+ onAttachMenuToggleClick: jest.fn(),
236
+ onAttachMenuInputChange: jest.fn(),
237
+ attachMenuItems: ATTACH_MENU_ITEMS,
238
+ searchInputProps: { isDisabled: true }
239
+ }}
240
+ />
241
+ );
242
+ expect(screen.getByRole('textbox', { name: /Filter menu items/i })).toBeDisabled();
243
+ });
244
+ it('can pass menuSearchProps to search input in AttachMenu', () => {
245
+ render(
246
+ <MessageBar
247
+ onSendMessage={jest.fn}
248
+ value="test"
249
+ attachMenuProps={{
250
+ isAttachMenuOpen: true,
251
+ setIsAttachMenuOpen: jest.fn(),
252
+ onAttachMenuToggleClick: jest.fn(),
253
+ onAttachMenuInputChange: jest.fn(),
254
+ attachMenuItems: ATTACH_MENU_ITEMS,
255
+ menuSearchProps: { 'data-testid': 'menu-search' } as MenuSearchProps
256
+ }}
257
+ />
258
+ );
259
+ expect(screen.getByTestId('menu-search')).toBeTruthy();
260
+ });
261
+ it('can pass menuSearchInputProps to search input in AttachMenu', () => {
262
+ render(
263
+ <MessageBar
264
+ onSendMessage={jest.fn}
265
+ value="test"
266
+ attachMenuProps={{
267
+ isAttachMenuOpen: true,
268
+ setIsAttachMenuOpen: jest.fn(),
269
+ onAttachMenuToggleClick: jest.fn(),
270
+ onAttachMenuInputChange: jest.fn(),
271
+ attachMenuItems: ATTACH_MENU_ITEMS,
272
+ menuSearchInputProps: { 'data-testid': 'menu-search-input' } as MenuSearchInputProps
273
+ }}
274
+ />
275
+ );
276
+ expect(screen.getByTestId('menu-search-input')).toBeTruthy();
277
+ });
278
+ it('can remove input from attach menu', async () => {
279
+ render(
280
+ <MessageBar
281
+ onSendMessage={jest.fn}
282
+ attachMenuProps={{
283
+ isAttachMenuOpen: true,
284
+ setIsAttachMenuOpen: jest.fn(),
285
+ onAttachMenuToggleClick: jest.fn(),
286
+ attachMenuItems: ATTACH_MENU_ITEMS
287
+ }}
288
+ />
289
+ );
290
+ expect(screen.queryByRole('textbox', { name: /Filter menu items/i })).not.toBeInTheDocument();
291
+ });
221
292
  it('can hide attach button', () => {
222
293
  render(<MessageBar onSendMessage={jest.fn} hasAttachButton={false} />);
223
294
  expect(screen.queryByRole('button', { name: 'Attach' })).toBeFalsy();
@@ -268,6 +339,20 @@ describe('Message bar', () => {
268
339
  );
269
340
  await userEvent.click(screen.getByRole('button', { name: 'Test' }));
270
341
  });
342
+ it('can change attach button icon', () => {
343
+ render(
344
+ <MessageBar
345
+ onSendMessage={jest.fn}
346
+ hasAttachButton
347
+ buttonProps={{
348
+ attach: {
349
+ icon: <img alt="" src="" />
350
+ }
351
+ }}
352
+ />
353
+ );
354
+ expect(screen.getByRole('img')).toBeVisible();
355
+ });
271
356
 
272
357
  // Stop button
273
358
  // --------------------------------------------------------------------------
@@ -387,4 +472,47 @@ describe('Message bar', () => {
387
472
  ref.current?.focus();
388
473
  expect(document.activeElement).toBe(screen.getByRole('textbox'));
389
474
  });
475
+ it('should handle isPrimary', () => {
476
+ const { container } = render(<MessageBar isPrimary onSendMessage={jest.fn} />);
477
+ expect(container.querySelector('.pf-m-primary')).toBeTruthy();
478
+ });
479
+
480
+ it('Renders with class pf-v6-m-ai-indicator when hasAiIndicator is true', () => {
481
+ render(<MessageBar onSendMessage={jest.fn} hasAiIndicator />);
482
+
483
+ expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar')).toHaveClass('pf-v6-m-ai-indicator');
484
+ });
485
+
486
+ it('Renders with class pf-v6-m-thinking when isThinking is true', () => {
487
+ render(<MessageBar onSendMessage={jest.fn} isThinking />);
488
+
489
+ expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar')).toHaveClass('pf-v6-m-thinking');
490
+ });
491
+
492
+ it('Renders with flex-basis of auto by default', () => {
493
+ render(<MessageBar onSendMessage={jest.fn} />);
494
+
495
+ expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar-input')).toHaveAttribute(
496
+ 'style',
497
+ 'flex-basis: auto;'
498
+ );
499
+ });
500
+
501
+ it('Renders with flex-basis of 100% when forceMultilineLayout is true', () => {
502
+ render(<MessageBar forceMultilineLayout onSendMessage={jest.fn} />);
503
+
504
+ expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar-input')).toHaveAttribute(
505
+ 'style',
506
+ 'flex-basis: 100%;'
507
+ );
508
+ });
509
+
510
+ it('Renders with flex-basis of 100% when additionalActions is truthy', () => {
511
+ render(<MessageBar additionalActions="actions" onSendMessage={jest.fn} />);
512
+
513
+ expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar-input')).toHaveAttribute(
514
+ 'style',
515
+ 'flex-basis: 100%;'
516
+ );
517
+ });
390
518
  });
@@ -1,12 +1,21 @@
1
1
  import type { ChangeEvent, FunctionComponent, KeyboardEvent as ReactKeyboardEvent, Ref } from 'react';
2
2
  import { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
3
3
  import { Accept, DropEvent, DropzoneOptions, FileError, FileRejection } from 'react-dropzone';
4
- import { ButtonProps, TextArea, TextAreaProps, TooltipProps } from '@patternfly/react-core';
4
+ import {
5
+ ButtonProps,
6
+ MenuSearchInputProps,
7
+ MenuSearchProps,
8
+ SearchInputProps,
9
+ TextArea,
10
+ TextAreaProps,
11
+ TooltipProps
12
+ } from '@patternfly/react-core';
13
+ import { css } from '@patternfly/react-styles';
5
14
 
6
15
  // Import Chatbot components
7
16
  import SendButton from './SendButton';
8
17
  import MicrophoneButton from './MicrophoneButton';
9
- import { AttachButton } from './AttachButton';
18
+ import { AttachButton, AttachButtonProps } from './AttachButton';
10
19
  import AttachMenu from '../AttachMenu';
11
20
  import StopButton from './StopButton';
12
21
  import { ChatbotDisplayMode } from '../Chatbot';
@@ -21,7 +30,7 @@ export interface MessageBarWithAttachMenuProps {
21
30
  /** A callback for when the attachment menu toggle is clicked */
22
31
  onAttachMenuToggleClick: () => void;
23
32
  /** A callback for when the input value in the menu changes. */
24
- onAttachMenuInputChange: (value: string) => void;
33
+ onAttachMenuInputChange?: (value: string) => void;
25
34
  /** Function callback called when user selects item in menu. */
26
35
  onAttachMenuSelect?: (event?: React.MouseEvent<Element, MouseEvent>, value?: string | number) => void;
27
36
  /** Placeholder for search input */
@@ -30,6 +39,12 @@ export interface MessageBarWithAttachMenuProps {
30
39
  onAttachMenuOnOpenChangeKeys?: string[];
31
40
  /** Callback to change the open state of the menu. Triggered by clicking outside of the menu. */
32
41
  onAttachMenuOpenChange?: (isOpen: boolean) => void;
42
+ /** Additional props passed to MenuSearch component in attach menu */
43
+ menuSearchProps?: Omit<MenuSearchProps, 'ref'>;
44
+ /** Additional props passed to MenuSearchInput component in attach menu */
45
+ menuSearchInputProps?: Omit<MenuSearchInputProps, 'ref'>;
46
+ /** Additional props passed to SearchInput component in attach menu */
47
+ searchInputProps?: SearchInputProps;
33
48
  }
34
49
 
35
50
  export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
@@ -43,6 +58,8 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
43
58
  placeholder?: string;
44
59
  /** Flag to disable/enable the Attach button */
45
60
  hasAttachButton?: boolean;
61
+ /** Whether the attach button is rendered before or after the message input. */
62
+ attachButtonPosition?: 'start' | 'end';
46
63
  /** Flag to enable the Microphone button */
47
64
  hasMicrophoneButton?: boolean;
48
65
  /** Placeholder text when listening */
@@ -81,12 +98,7 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
81
98
  isSendButtonDisabled?: boolean;
82
99
  /** Prop to allow passage of additional props to buttons */
83
100
  buttonProps?: {
84
- attach?: {
85
- tooltipContent?: string;
86
- props?: ButtonProps;
87
- inputTestId?: string;
88
- tooltipProps?: Omit<TooltipProps, 'content'>;
89
- };
101
+ attach?: AttachButtonProps & { props?: ButtonProps };
90
102
  stop?: { tooltipContent?: string; props?: ButtonProps; tooltipProps?: Omit<TooltipProps, 'content'> };
91
103
  send?: { tooltipContent?: string; props?: ButtonProps; tooltipProps?: Omit<TooltipProps, 'content'> };
92
104
  microphone?: {
@@ -104,6 +116,16 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
104
116
  isCompact?: boolean;
105
117
  /** Ref applied to message bar textarea, for use with focus or other custom behaviors */
106
118
  innerRef?: React.Ref<HTMLTextAreaElement>;
119
+ /** Sets background color to primary */
120
+ isPrimary?: boolean;
121
+ /** Additional actions to render for the message bar. This will force a multiline layout, and the actions will render at the start of the container. */
122
+ additionalActions?: React.ReactNode;
123
+ /** Flag indicating whether a multiline layout for the message input and actions should be forced. This can be used to always render actions below the message input. */
124
+ forceMultilineLayout?: boolean;
125
+ /** @beta Flag indicating whether the message bar has an AI indicator border. */
126
+ hasAiIndicator?: boolean;
127
+ /** @beta Flag indicating whether the chatbot is thinking in response to a query, adding an animation to the message bar. */
128
+ isThinking?: boolean;
107
129
  }
108
130
 
109
131
  export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
@@ -112,6 +134,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
112
134
  alwayShowSendButton,
113
135
  placeholder = 'Send a message...',
114
136
  hasAttachButton = true,
137
+ attachButtonPosition = 'end',
115
138
  hasMicrophoneButton,
116
139
  listeningText = 'Listening',
117
140
  handleAttach,
@@ -134,6 +157,11 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
134
157
  validator,
135
158
  dropzoneProps,
136
159
  innerRef,
160
+ isPrimary,
161
+ additionalActions,
162
+ forceMultilineLayout = false,
163
+ hasAiIndicator,
164
+ isThinking,
137
165
  ...props
138
166
  }: MessageBarProps) => {
139
167
  // Text Input
@@ -142,12 +170,21 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
142
170
  const [isListeningMessage, setIsListeningMessage] = useState<boolean>(false);
143
171
  const [hasSentMessage, setHasSentMessage] = useState(false);
144
172
  const [isComposing, setIsComposing] = useState(false);
173
+
174
+ const shouldForceMultiline = forceMultilineLayout || additionalActions;
175
+ const [isMultiline, setIsMultiline] = useState(shouldForceMultiline);
145
176
  const inputRef = useRef<HTMLTextAreaElement>(null);
146
177
  const textareaRef = (innerRef as React.RefObject<HTMLTextAreaElement>) ?? inputRef;
147
178
  const attachButtonRef = useRef<HTMLButtonElement>(null);
148
179
 
149
180
  const topMargin = '1rem';
150
181
 
182
+ useEffect(() => {
183
+ if (value !== undefined && value !== message) {
184
+ setMessage(value);
185
+ }
186
+ }, [value, message]);
187
+
151
188
  const setInitialLineHeight = (field: HTMLTextAreaElement) => {
152
189
  field.style.setProperty('line-height', '1rem');
153
190
  const parent = field.parentElement;
@@ -158,7 +195,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
158
195
 
159
196
  const grandparent = parent.parentElement;
160
197
  if (grandparent) {
161
- grandparent.style.setProperty('flex-basis', 'auto');
198
+ grandparent.style.setProperty('flex-basis', shouldForceMultiline ? '100%' : 'auto');
162
199
  }
163
200
  }
164
201
  };
@@ -190,11 +227,24 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
190
227
  return lines > 2;
191
228
  };
192
229
 
230
+ const checkIfMultiline = useCallback(
231
+ (field: HTMLTextAreaElement) => {
232
+ const parent = field.parentElement;
233
+ const grandparent = parent?.parentElement;
234
+ if (grandparent) {
235
+ const containerHeight = grandparent.offsetHeight;
236
+ const threshold = isCompact ? 56 : 70;
237
+ setIsMultiline(containerHeight > threshold);
238
+ }
239
+ },
240
+ [isCompact]
241
+ );
242
+
193
243
  const setAutoWidth = useCallback((field: HTMLTextAreaElement) => {
194
244
  const parent = field.parentElement;
195
245
  if (parent) {
196
246
  const grandparent = parent.parentElement;
197
- if (textIsLongerThan2Lines(field) && grandparent) {
247
+ if ((textIsLongerThan2Lines(field) || shouldForceMultiline) && grandparent) {
198
248
  grandparent.style.setProperty('flex-basis', `100%`);
199
249
  }
200
250
  }
@@ -244,12 +294,14 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
244
294
  if (field) {
245
295
  if (field.value === '') {
246
296
  setInitialLineHeight(field);
297
+ !shouldForceMultiline && setIsMultiline(false);
247
298
  } else {
248
299
  setAutoHeight(field);
249
300
  setAutoWidth(field);
301
+ !shouldForceMultiline && checkIfMultiline(field);
250
302
  }
251
303
  }
252
- }, [displayMode, message, setAutoWidth]);
304
+ }, [displayMode, message, setAutoWidth, shouldForceMultiline, checkIfMultiline]);
253
305
 
254
306
  useEffect(() => {
255
307
  const field = textareaRef.current;
@@ -265,13 +317,15 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
265
317
  if (textareaRef.current) {
266
318
  if (event.target.value === '') {
267
319
  setInitialLineHeight(textareaRef.current);
320
+ !shouldForceMultiline && setIsMultiline(false);
268
321
  } else {
269
322
  setAutoHeight(textareaRef.current);
323
+ !shouldForceMultiline && checkIfMultiline(textareaRef.current);
270
324
  }
271
325
  }
272
326
  setMessage(event.target.value);
273
327
  },
274
- [onChange]
328
+ [onChange, checkIfMultiline]
275
329
  );
276
330
 
277
331
  // Handle sending message
@@ -328,6 +382,55 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
328
382
  onChange && onChange({} as ChangeEvent<HTMLTextAreaElement>, message);
329
383
  };
330
384
 
385
+ const renderAttachButton = () => {
386
+ if (!attachMenuProps && hasAttachButton) {
387
+ return (
388
+ <AttachButton
389
+ onAttachAccepted={handleAttach}
390
+ isDisabled={isListeningMessage}
391
+ tooltipContent={buttonProps?.attach?.tooltipContent}
392
+ inputTestId={buttonProps?.attach?.inputTestId}
393
+ isCompact={isCompact}
394
+ tooltipProps={buttonProps?.attach?.tooltipProps}
395
+ allowedFileTypes={allowedFileTypes}
396
+ minSize={minSize}
397
+ maxSize={maxSize}
398
+ maxFiles={maxFiles}
399
+ isAttachmentDisabled={isAttachmentDisabled}
400
+ onAttach={onAttach}
401
+ onAttachRejected={onAttachRejected}
402
+ validator={validator}
403
+ dropzoneProps={dropzoneProps}
404
+ {...buttonProps?.attach}
405
+ {...buttonProps?.attach?.props}
406
+ />
407
+ );
408
+ }
409
+ if (attachMenuProps) {
410
+ return (
411
+ <AttachButton
412
+ ref={attachButtonRef}
413
+ onClick={handleAttachMenuToggle}
414
+ isDisabled={isListeningMessage}
415
+ tooltipContent={buttonProps?.attach?.tooltipContent}
416
+ isCompact={isCompact}
417
+ tooltipProps={buttonProps?.attach?.tooltipProps}
418
+ allowedFileTypes={allowedFileTypes}
419
+ minSize={minSize}
420
+ maxSize={maxSize}
421
+ maxFiles={maxFiles}
422
+ isAttachmentDisabled={isAttachmentDisabled}
423
+ onAttach={onAttach}
424
+ onAttachRejected={onAttachRejected}
425
+ validator={validator}
426
+ dropzoneProps={dropzoneProps}
427
+ {...buttonProps?.attach}
428
+ />
429
+ );
430
+ }
431
+ };
432
+
433
+ const isAttachButtonAtStart = attachButtonPosition === 'start';
331
434
  const renderButtons = () => {
332
435
  if (hasStopButton && handleStopButton) {
333
436
  return (
@@ -342,46 +445,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
342
445
  }
343
446
  return (
344
447
  <>
345
- {attachMenuProps && (
346
- <AttachButton
347
- ref={attachButtonRef}
348
- onClick={handleAttachMenuToggle}
349
- isDisabled={isListeningMessage}
350
- tooltipContent={buttonProps?.attach?.tooltipContent}
351
- isCompact={isCompact}
352
- tooltipProps={buttonProps?.attach?.tooltipProps}
353
- allowedFileTypes={allowedFileTypes}
354
- minSize={minSize}
355
- maxSize={maxSize}
356
- maxFiles={maxFiles}
357
- isAttachmentDisabled={isAttachmentDisabled}
358
- onAttach={onAttach}
359
- onAttachRejected={onAttachRejected}
360
- validator={validator}
361
- dropzoneProps={dropzoneProps}
362
- {...buttonProps?.attach?.props}
363
- />
364
- )}
365
- {!attachMenuProps && hasAttachButton && (
366
- <AttachButton
367
- onAttachAccepted={handleAttach}
368
- isDisabled={isListeningMessage}
369
- tooltipContent={buttonProps?.attach?.tooltipContent}
370
- inputTestId={buttonProps?.attach?.inputTestId}
371
- isCompact={isCompact}
372
- tooltipProps={buttonProps?.attach?.tooltipProps}
373
- allowedFileTypes={allowedFileTypes}
374
- minSize={minSize}
375
- maxSize={maxSize}
376
- maxFiles={maxFiles}
377
- isAttachmentDisabled={isAttachmentDisabled}
378
- onAttach={onAttach}
379
- onAttachRejected={onAttachRejected}
380
- validator={validator}
381
- dropzoneProps={dropzoneProps}
382
- {...buttonProps?.attach?.props}
383
- />
384
- )}
448
+ {!isAttachButtonAtStart && renderAttachButton()}
385
449
  {hasMicrophoneButton && (
386
450
  <MicrophoneButton
387
451
  isListening={isListeningMessage}
@@ -409,8 +473,12 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
409
473
  );
410
474
  };
411
475
 
476
+ const hasGroupedActions = additionalActions || (isAttachButtonAtStart && isMultiline);
412
477
  const messageBarContents = (
413
478
  <>
479
+ {isAttachButtonAtStart && !isMultiline && (
480
+ <div className="pf-chatbot__message-bar-actions test">{renderAttachButton()}</div>
481
+ )}
414
482
  <div className={`pf-chatbot__message-bar-input ${isCompact ? 'pf-m-compact' : ''}`}>
415
483
  <TextArea
416
484
  className="pf-chatbot__message-textarea"
@@ -425,7 +493,19 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
425
493
  {...props}
426
494
  />
427
495
  </div>
428
- <div className="pf-chatbot__message-bar-actions">{renderButtons()}</div>
496
+ <div className={css('pf-chatbot__message-bar-actions', hasGroupedActions && 'pf-m-grouped')}>
497
+ {hasGroupedActions ? (
498
+ <>
499
+ <div className={css('pf-chatbot__message-bar-actions-group')}>
500
+ {isAttachButtonAtStart && renderAttachButton()}
501
+ {additionalActions}
502
+ </div>
503
+ <div className={css('pf-chatbot__message-bar-actions-group')}>{renderButtons()}</div>
504
+ </>
505
+ ) : (
506
+ renderButtons()
507
+ )}
508
+ </div>
429
509
  </>
430
510
  );
431
511
 
@@ -433,7 +513,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
433
513
  return (
434
514
  <AttachMenu
435
515
  toggle={(toggleRef) => (
436
- <div ref={toggleRef} className={`pf-chatbot__message-bar ${className ?? ''}`}>
516
+ <div ref={toggleRef} className={css('pf-chatbot__message-bar', isMultiline && 'pf-m-multiline', className)}>
437
517
  {messageBarContents}
438
518
  </div>
439
519
  )}
@@ -449,11 +529,25 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
449
529
  {...(attachMenuProps && { handleTextInputChange: attachMenuProps.onAttachMenuInputChange })}
450
530
  popperProps={{ direction: 'up', distance: 8 }}
451
531
  searchInputPlaceholder={attachMenuProps?.attachMenuInputPlaceholder}
532
+ {...attachMenuProps}
452
533
  />
453
534
  );
454
535
  }
455
536
 
456
- return <div className={`pf-chatbot__message-bar ${className ?? ''}`}>{messageBarContents}</div>;
537
+ return (
538
+ <div
539
+ className={css(
540
+ 'pf-chatbot__message-bar',
541
+ isPrimary && 'pf-m-primary',
542
+ hasAiIndicator && 'pf-v6-m-ai-indicator',
543
+ isThinking && 'pf-v6-m-thinking',
544
+ isMultiline && 'pf-m-multiline',
545
+ className
546
+ )}
547
+ >
548
+ {messageBarContents}
549
+ </div>
550
+ );
457
551
  };
458
552
 
459
553
  const MessageBar = forwardRef((props: MessageBarProps, ref: Ref<HTMLTextAreaElement>) => (
@@ -53,6 +53,5 @@
53
53
  .pf-v6-c-button.pf-chatbot__button--microphone.pf-m-compact {
54
54
  width: 1.5rem;
55
55
  height: 1.5rem;
56
- padding: var(--pf-t--global--spacer--sm);
57
56
  align-items: center;
58
57
  }
@@ -58,6 +58,5 @@
58
58
  .pf-v6-c-button.pf-chatbot__button--send.pf-m-compact {
59
59
  width: 1.5rem;
60
60
  height: 1.5rem;
61
- padding: var(--pf-t--global--spacer--sm);
62
61
  align-items: center;
63
62
  }
@@ -41,6 +41,5 @@
41
41
  .pf-v6-c-button.pf-chatbot__button--stop.pf-m-compact {
42
42
  width: 1.5rem;
43
43
  height: 1.5rem;
44
- padding: var(--pf-t--global--spacer--sm);
45
44
  align-items: center;
46
45
  }