@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
@@ -3,14 +3,12 @@
3
3
  // ============================================================================
4
4
  import { forwardRef, ReactNode, useEffect, useState } from 'react';
5
5
  import type { FunctionComponent, HTMLProps, MouseEvent as ReactMouseEvent, Ref } from 'react';
6
- import Markdown, { Options } from 'react-markdown';
7
- import remarkGfm from 'remark-gfm';
6
+ import { Options } from 'react-markdown';
8
7
  import {
9
8
  AlertProps,
10
9
  Avatar,
11
10
  AvatarProps,
12
11
  ButtonProps,
13
- ContentVariants,
14
12
  FormProps,
15
13
  Label,
16
14
  LabelGroupProps,
@@ -18,42 +16,25 @@ import {
18
16
  Truncate
19
17
  } from '@patternfly/react-core';
20
18
  import MessageLoading from './MessageLoading';
21
- import CodeBlockMessage, { CodeBlockMessageProps } from './CodeBlockMessage/CodeBlockMessage';
22
- import TextMessage from './TextMessage/TextMessage';
19
+ import { CodeBlockMessageProps } from './CodeBlockMessage/CodeBlockMessage';
23
20
  import FileDetailsLabel from '../FileDetailsLabel/FileDetailsLabel';
24
21
  import ResponseActions, { ActionProps } from '../ResponseActions/ResponseActions';
25
22
  import SourcesCard, { SourcesCardProps } from '../SourcesCard';
26
- import ListItemMessage from './ListMessage/ListItemMessage';
27
- import UnorderedListMessage from './ListMessage/UnorderedListMessage';
28
- import OrderedListMessage from './ListMessage/OrderedListMessage';
29
23
  import QuickStartTile from './QuickStarts/QuickStartTile';
30
24
  import { QuickStart, QuickstartAction } from './QuickStarts/types';
31
25
  import QuickResponse from './QuickResponse/QuickResponse';
32
26
  import UserFeedback, { UserFeedbackProps } from './UserFeedback/UserFeedback';
33
27
  import UserFeedbackComplete, { UserFeedbackCompleteProps } from './UserFeedback/UserFeedbackComplete';
34
- import TableMessage from './TableMessage/TableMessage';
35
- import TrMessage from './TableMessage/TrMessage';
36
- import TdMessage from './TableMessage/TdMessage';
37
- import TbodyMessage from './TableMessage/TbodyMessage';
38
- import TheadMessage from './TableMessage/TheadMessage';
39
- import ThMessage from './TableMessage/ThMessage';
40
28
  import { TableProps } from '@patternfly/react-table';
41
- import ImageMessage from './ImageMessage/ImageMessage';
42
- import rehypeUnwrapImages from 'rehype-unwrap-images';
43
- import rehypeExternalLinks from 'rehype-external-links';
44
- import rehypeSanitize from 'rehype-sanitize';
45
- import rehypeHighlight from 'rehype-highlight';
46
29
  // see the full list of styles here: https://highlightjs.org/examples
47
30
  import 'highlight.js/styles/vs2015.css';
48
31
  import { PluggableList } from 'unified';
49
- import LinkMessage from './LinkMessage/LinkMessage';
50
32
  import ErrorMessage from './ErrorMessage/ErrorMessage';
51
33
  import MessageInput from './MessageInput';
52
- import { rehypeMoveImagesOutOfParagraphs } from './Plugins/rehypeMoveImagesOutOfParagraphs';
53
34
  import ToolResponse, { ToolResponseProps } from '../ToolResponse';
54
35
  import DeepThinking, { DeepThinkingProps } from '../DeepThinking';
55
- import SuperscriptMessage from './SuperscriptMessage/SuperscriptMessage';
56
36
  import ToolCall, { ToolCallProps } from '../ToolCall';
37
+ import MarkdownContent from '../MarkdownContent';
57
38
 
58
39
  export interface MessageAttachment {
59
40
  /** Name of file attached to the message */
@@ -86,6 +67,8 @@ export interface MessageExtraContent {
86
67
  }
87
68
 
88
69
  export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
70
+ /** Children to render instead of the default message structure, allowing more fine-tuned message control. When provided, this will override the default rendering of content, toolResponse, deepThinking, toolCall, sources, quickStarts, actions, etc. */
71
+ children?: ReactNode;
89
72
  /** Unique id for message */
90
73
  id?: string;
91
74
  /** Role of the user sending the message */
@@ -97,17 +80,35 @@ export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
97
80
  /** Name of the user */
98
81
  name?: string;
99
82
  /** Avatar src for the user */
100
- avatar: string;
83
+ avatar?: string;
101
84
  /** Timestamp for the message */
102
85
  timestamp?: string;
103
86
  /** Set this to true if message is being loaded */
104
87
  isLoading?: boolean;
105
88
  /** Array of attachments attached to a message */
106
89
  attachments?: MessageAttachment[];
107
- /** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen */
108
- actions?: {
109
- [key: string]: ActionProps;
110
- };
90
+ /** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen.
91
+ * Can be a single actions object or an array of action group objects. When passing an array, you can pass an object of actions or
92
+ * an object that contains an actions property for finer control of selection persistence.
93
+ */
94
+ actions?:
95
+ | {
96
+ [key: string]: ActionProps;
97
+ }
98
+ | {
99
+ [key: string]: ActionProps;
100
+ }[]
101
+ | {
102
+ actions: {
103
+ [key: string]: ActionProps;
104
+ };
105
+ persistActionSelection?: boolean;
106
+ }[];
107
+ /** When true, the selected action will persist even when clicking outside the component.
108
+ * When false (default), clicking outside or clicking another action will deselect the current selection.
109
+ * For finer control of multiple action groups, use persistActionSelection on each group.
110
+ */
111
+ persistActionSelection?: boolean;
111
112
  /** Sources for message */
112
113
  sources?: SourcesCardProps;
113
114
  /** Label for the English word "AI," used to tag messages with role "bot" */
@@ -189,9 +190,12 @@ export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
189
190
  toolCall?: ToolCallProps;
190
191
  /** Whether user messages default to stripping out images in markdown */
191
192
  hasNoImagesInUserMessages?: boolean;
193
+ /** Sets background colors to be appropriate on primary chatbot background */
194
+ isPrimary?: boolean;
192
195
  }
193
196
 
194
197
  export const MessageBase: FunctionComponent<MessageProps> = ({
198
+ children,
195
199
  role,
196
200
  content,
197
201
  extraContent,
@@ -200,6 +204,7 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
200
204
  timestamp,
201
205
  isLoading,
202
206
  actions,
207
+ persistActionSelection,
203
208
  sources,
204
209
  botWord = 'AI',
205
210
  loadingWord = 'Loading message',
@@ -236,6 +241,7 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
236
241
  remarkGfmProps,
237
242
  toolCall,
238
243
  hasNoImagesInUserMessages = true,
244
+ isPrimary,
239
245
  ...props
240
246
  }: MessageProps) => {
241
247
  const [messageText, setMessageText] = useState(content);
@@ -245,14 +251,8 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
245
251
  }, [content]);
246
252
 
247
253
  const { beforeMainContent, afterMainContent, endContent } = extraContent || {};
248
- let rehypePlugins: PluggableList = [rehypeUnwrapImages, rehypeMoveImagesOutOfParagraphs, rehypeHighlight];
249
- if (openLinkInNewTab) {
250
- rehypePlugins = rehypePlugins.concat([[rehypeExternalLinks, { target: '_blank' }, rehypeSanitize]]);
251
- }
252
- if (additionalRehypePlugins) {
253
- rehypePlugins.push(...additionalRehypePlugins);
254
- }
255
- let avatarClassName;
254
+
255
+ let avatarClassName: string | undefined;
256
256
  if (avatarProps && 'className' in avatarProps) {
257
257
  const { className, ...rest } = avatarProps;
258
258
  avatarClassName = className;
@@ -262,161 +262,26 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
262
262
  const date = new Date();
263
263
  const dateString = timestamp ?? `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
264
264
 
265
- const disallowedElements = role === 'user' && hasNoImagesInUserMessages ? ['img'] : [];
266
- if (reactMarkdownProps && reactMarkdownProps.disallowedElements) {
267
- disallowedElements.push(...reactMarkdownProps.disallowedElements);
268
- }
269
-
270
- const handleMarkdown = () => {
271
- if (isMarkdownDisabled) {
272
- return (
273
- <TextMessage component={ContentVariants.p} {...props}>
274
- {messageText}
275
- </TextMessage>
276
- );
277
- }
278
- return (
279
- <Markdown
280
- components={{
281
- section: (props) => {
282
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
283
- const { node, ...rest } = props;
284
- return <section {...rest} className={`pf-chatbot__message-text ${rest?.className}`} />;
285
- },
286
- p: (props) => {
287
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
288
- const { node, ...rest } = props;
289
- return <TextMessage component={ContentVariants.p} {...rest} />;
290
- },
291
- code: ({ children, ...props }) => {
292
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
293
- const { node, ...codeProps } = props;
294
- return (
295
- <CodeBlockMessage {...codeProps} {...codeBlockProps}>
296
- {children}
297
- </CodeBlockMessage>
298
- );
299
- },
300
- h1: (props) => {
301
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
302
- const { node, ...rest } = props;
303
- return <TextMessage component={ContentVariants.h1} {...rest} />;
304
- },
305
- h2: (props) => {
306
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
307
- const { node, ...rest } = props;
308
- return <TextMessage component={ContentVariants.h2} {...rest} />;
309
- },
310
- h3: (props) => {
311
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
312
- const { node, ...rest } = props;
313
- return <TextMessage component={ContentVariants.h3} {...rest} />;
314
- },
315
- h4: (props) => {
316
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
317
- const { node, ...rest } = props;
318
- return <TextMessage component={ContentVariants.h4} {...rest} />;
319
- },
320
- h5: (props) => {
321
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
322
- const { node, ...rest } = props;
323
- return <TextMessage component={ContentVariants.h5} {...rest} />;
324
- },
325
- h6: (props) => {
326
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
327
- const { node, ...rest } = props;
328
- return <TextMessage component={ContentVariants.h6} {...rest} />;
329
- },
330
- blockquote: (props) => {
331
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
332
- const { node, ...rest } = props;
333
- return <TextMessage component={ContentVariants.blockquote} {...rest} />;
334
- },
335
- ul: (props) => {
336
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
337
- const { node, ...rest } = props;
338
- return <UnorderedListMessage {...rest} />;
339
- },
340
- ol: (props) => {
341
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
342
- const { node, ...rest } = props;
343
- return <OrderedListMessage {...rest} />;
344
- },
345
- li: (props) => {
346
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
347
- const { node, ...rest } = props;
348
- return <ListItemMessage {...rest} />;
349
- },
350
- // table requires node attribute for calculating headers for mobile breakpoint
351
- table: (props) => <TableMessage {...props} {...tableProps} />,
352
- tbody: (props) => {
353
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
354
- const { node, ...rest } = props;
355
- return <TbodyMessage {...rest} />;
356
- },
357
- thead: (props) => {
358
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
359
- const { node, ...rest } = props;
360
- return <TheadMessage {...rest} />;
361
- },
362
- tr: (props) => {
363
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
364
- const { node, ...rest } = props;
365
- return <TrMessage {...rest} />;
366
- },
367
- td: (props) => {
368
- // Conflicts with Td type
369
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
370
- const { node, width, ...rest } = props;
371
- return <TdMessage {...rest} />;
372
- },
373
- th: (props) => {
374
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
375
- const { node, ...rest } = props;
376
- return <ThMessage {...rest} />;
377
- },
378
- img: (props) => {
379
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
380
- const { node, ...rest } = props;
381
- return <ImageMessage {...rest} />;
382
- },
383
- a: (props) => {
384
- // node is just the details of the document structure - not needed
385
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
386
- const { node, ...rest } = props;
387
- return (
388
- // some a types conflict with ButtonProps, but it's ok because we are using an a tag
389
- // there are too many to handle manually
390
- <LinkMessage {...(rest as any)} {...linkProps}>
391
- {props.children}
392
- </LinkMessage>
393
- );
394
- },
395
- // used for footnotes
396
- sup: (props) => {
397
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
398
- const { node, ...rest } = props;
399
- return <SuperscriptMessage {...rest} />;
400
- }
401
- }}
402
- remarkPlugins={[[remarkGfm, { ...remarkGfmProps }], ...additionalRemarkPlugins]}
403
- rehypePlugins={rehypePlugins}
404
- {...reactMarkdownProps}
405
- remarkRehypeOptions={{
406
- // removes sr-only class from footnote labels applied by default
407
- footnoteLabelProperties: { className: [''] },
408
- ...reactMarkdownProps?.remarkRehypeOptions
409
- }}
410
- disallowedElements={disallowedElements}
411
- >
412
- {messageText}
413
- </Markdown>
414
- );
415
- };
265
+ const handleMarkdown = () => (
266
+ <MarkdownContent
267
+ content={messageText}
268
+ isMarkdownDisabled={isMarkdownDisabled}
269
+ codeBlockProps={codeBlockProps}
270
+ tableProps={tableProps}
271
+ openLinkInNewTab={openLinkInNewTab}
272
+ additionalRehypePlugins={additionalRehypePlugins}
273
+ additionalRemarkPlugins={additionalRemarkPlugins}
274
+ linkProps={linkProps}
275
+ reactMarkdownProps={reactMarkdownProps}
276
+ remarkGfmProps={remarkGfmProps}
277
+ hasNoImages={role === 'user' && hasNoImagesInUserMessages}
278
+ isPrimary={isPrimary}
279
+ />
280
+ );
416
281
 
417
282
  const renderMessage = () => {
418
283
  if (isLoading) {
419
- return <MessageLoading loadingWord={loadingWord} />;
284
+ return <MessageLoading loadingWord={loadingWord} isPrimary={isPrimary} />;
420
285
  }
421
286
  if (isEditable) {
422
287
  return (
@@ -456,12 +321,14 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
456
321
  {...props}
457
322
  >
458
323
  {/* We are using an empty alt tag intentionally in order to reduce noise on screen readers */}
459
- <Avatar
460
- className={`pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`}
461
- src={avatar}
462
- alt=""
463
- {...avatarProps}
464
- />
324
+ {avatar && (
325
+ <Avatar
326
+ className={`pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`}
327
+ src={avatar}
328
+ alt=""
329
+ {...avatarProps}
330
+ />
331
+ )}
465
332
  <div className="pf-chatbot__message-contents">
466
333
  <div className="pf-chatbot__message-meta">
467
334
  {name && (
@@ -477,57 +344,82 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
477
344
  <Timestamp date={date}>{timestamp}</Timestamp>
478
345
  </div>
479
346
  <div className="pf-chatbot__message-response">
480
- <div className="pf-chatbot__message-and-actions">
481
- {renderMessage()}
482
- {afterMainContent && <>{afterMainContent}</>}
483
- {toolResponse && <ToolResponse {...toolResponse} />}
484
- {deepThinking && <DeepThinking {...deepThinking} />}
485
- {toolCall && <ToolCall {...toolCall} />}
486
- {!isLoading && sources && <SourcesCard {...sources} isCompact={isCompact} />}
487
- {quickStarts && quickStarts.quickStart && (
488
- <QuickStartTile
489
- quickStart={quickStarts.quickStart}
490
- onSelectQuickStart={quickStarts.onSelectQuickStart}
491
- minuteWord={quickStarts.minuteWord}
492
- minuteWordPlural={quickStarts.minuteWordPlural}
493
- prerequisiteWord={quickStarts.prerequisiteWord}
494
- prerequisiteWordPlural={quickStarts.prerequisiteWordPlural}
495
- quickStartButtonAriaLabel={quickStarts.quickStartButtonAriaLabel}
496
- isCompact={isCompact}
497
- />
498
- )}
499
- {!isLoading && !isEditable && actions && <ResponseActions actions={actions} />}
500
- {userFeedbackForm && <UserFeedback {...userFeedbackForm} timestamp={dateString} isCompact={isCompact} />}
501
- {userFeedbackComplete && (
502
- <UserFeedbackComplete {...userFeedbackComplete} timestamp={dateString} isCompact={isCompact} />
503
- )}
504
- {!isLoading && quickResponses && (
505
- <QuickResponse
506
- quickResponses={quickResponses}
507
- quickResponseContainerProps={quickResponseContainerProps}
508
- isCompact={isCompact}
509
- />
510
- )}
511
- </div>
512
- {attachments && (
513
- <div className="pf-chatbot__message-attachments-container">
514
- {attachments.map((attachment) => (
515
- <div key={attachment.id ?? attachment.name} className="pf-chatbot__message-attachment">
516
- <FileDetailsLabel
517
- fileName={attachment.name}
518
- fileId={attachment.id}
519
- onClose={attachment.onClose}
520
- onClick={attachment.onClick}
521
- isLoading={attachment.isLoading}
522
- closeButtonAriaLabel={attachment.closeButtonAriaLabel}
523
- languageTestId={attachment.languageTestId}
524
- spinnerTestId={attachment.spinnerTestId}
347
+ {children ? (
348
+ <>{children}</>
349
+ ) : (
350
+ <>
351
+ <div className="pf-chatbot__message-and-actions">
352
+ {renderMessage()}
353
+ {afterMainContent && <>{afterMainContent}</>}
354
+ {toolResponse && <ToolResponse {...toolResponse} />}
355
+ {deepThinking && <DeepThinking {...deepThinking} />}
356
+ {toolCall && <ToolCall {...toolCall} />}
357
+ {!isLoading && sources && <SourcesCard {...sources} isCompact={isCompact} />}
358
+ {quickStarts && quickStarts.quickStart && (
359
+ <QuickStartTile
360
+ quickStart={quickStarts.quickStart}
361
+ onSelectQuickStart={quickStarts.onSelectQuickStart}
362
+ minuteWord={quickStarts.minuteWord}
363
+ minuteWordPlural={quickStarts.minuteWordPlural}
364
+ prerequisiteWord={quickStarts.prerequisiteWord}
365
+ prerequisiteWordPlural={quickStarts.prerequisiteWordPlural}
366
+ quickStartButtonAriaLabel={quickStarts.quickStartButtonAriaLabel}
367
+ isCompact={isCompact}
368
+ />
369
+ )}
370
+ {!isLoading && !isEditable && actions && (
371
+ <>
372
+ {Array.isArray(actions) ? (
373
+ <div className="pf-chatbot__response-actions-groups">
374
+ {actions.map((actionGroup, index) => (
375
+ <ResponseActions
376
+ key={index}
377
+ actions={actionGroup.actions || actionGroup}
378
+ persistActionSelection={persistActionSelection || actionGroup.persistActionSelection}
379
+ />
380
+ ))}
381
+ </div>
382
+ ) : (
383
+ <ResponseActions actions={actions} persistActionSelection={persistActionSelection} />
384
+ )}
385
+ </>
386
+ )}
387
+ {userFeedbackForm && (
388
+ <UserFeedback {...userFeedbackForm} timestamp={dateString} isCompact={isCompact} />
389
+ )}
390
+ {userFeedbackComplete && (
391
+ <UserFeedbackComplete {...userFeedbackComplete} timestamp={dateString} isCompact={isCompact} />
392
+ )}
393
+ {!isLoading && quickResponses && (
394
+ <QuickResponse
395
+ quickResponses={quickResponses}
396
+ quickResponseContainerProps={quickResponseContainerProps}
397
+ isCompact={isCompact}
525
398
  />
399
+ )}
400
+ </div>
401
+ {attachments && (
402
+ <div className="pf-chatbot__message-attachments-container">
403
+ {attachments.map((attachment) => (
404
+ <div key={attachment.id ?? attachment.name} className="pf-chatbot__message-attachment">
405
+ <FileDetailsLabel
406
+ fileName={attachment.name}
407
+ fileId={attachment.id}
408
+ onClose={attachment.onClose}
409
+ onClick={attachment.onClick}
410
+ isLoading={attachment.isLoading}
411
+ closeButtonAriaLabel={attachment.closeButtonAriaLabel}
412
+ languageTestId={attachment.languageTestId}
413
+ spinnerTestId={attachment.spinnerTestId}
414
+ variant={isPrimary ? 'outline' : undefined}
415
+ />
416
+ </div>
417
+ ))}
526
418
  </div>
527
- ))}
528
- </div>
419
+ )}
420
+ {!isLoading && endContent && <>{endContent}</>}
421
+ </>
529
422
  )}
530
- {!isLoading && endContent && <>{endContent}</>}
531
423
  </div>
532
424
  </div>
533
425
  </section>
@@ -0,0 +1,23 @@
1
+ import '@testing-library/jest-dom';
2
+ import { render, screen } from '@testing-library/react';
3
+ import MessageAndActions from './MessageAndActions';
4
+
5
+ test('Renders with children', () => {
6
+ render(<MessageAndActions>Test content</MessageAndActions>);
7
+ expect(screen.getByText('Test content')).toBeInTheDocument();
8
+ });
9
+
10
+ test('Renders with pf-chatbot__message-and-actions class by default', () => {
11
+ render(<MessageAndActions>Test content</MessageAndActions>);
12
+ expect(screen.getByText('Test content')).toHaveClass('pf-chatbot__message-and-actions', { exact: true });
13
+ });
14
+
15
+ test('Renders with custom className', () => {
16
+ render(<MessageAndActions className="custom-class">Test content</MessageAndActions>);
17
+ expect(screen.getByText('Test content')).toHaveClass('custom-class');
18
+ });
19
+
20
+ test('Spreads additional props', () => {
21
+ render(<MessageAndActions id="test-id">Test content</MessageAndActions>);
22
+ expect(screen.getByText('Test content')).toHaveAttribute('id', 'test-id');
23
+ });
@@ -0,0 +1,22 @@
1
+ import { FunctionComponent, HTMLProps, ReactNode } from 'react';
2
+ import { css } from '@patternfly/react-styles';
3
+
4
+ /**
5
+ * The container that wraps the primary message content and inline actions, such as ToolCall, ToolResponse, DeepThinking, ResponseActions, etc.
6
+ * Attachments should not be rendered inside this container.
7
+ * Use this component when passing children to Message to customize its structure.
8
+ */
9
+ export interface MessageAndActionsProps extends HTMLProps<HTMLDivElement> {
10
+ /** Content to render inside the message and actions container. */
11
+ children: ReactNode;
12
+ /** Additional classes applied to the message and actions container. */
13
+ className?: string;
14
+ }
15
+
16
+ export const MessageAndActions: FunctionComponent<MessageAndActionsProps> = ({ children, className, ...props }) => (
17
+ <div className={css('pf-chatbot__message-and-actions', className)} {...props}>
18
+ {children}
19
+ </div>
20
+ );
21
+
22
+ export default MessageAndActions;
@@ -0,0 +1 @@
1
+ export * from './MessageAndActions';
@@ -0,0 +1,23 @@
1
+ import '@testing-library/jest-dom';
2
+ import { render, screen } from '@testing-library/react';
3
+ import MessageAttachmentItem from './MessageAttachmentItem';
4
+
5
+ test('Renders with children', () => {
6
+ render(<MessageAttachmentItem>Test content</MessageAttachmentItem>);
7
+ expect(screen.getByText('Test content')).toBeInTheDocument();
8
+ });
9
+
10
+ test('Renders with pf-chatbot__message-attachment class by default', () => {
11
+ render(<MessageAttachmentItem>Test content</MessageAttachmentItem>);
12
+ expect(screen.getByText('Test content')).toHaveClass('pf-chatbot__message-attachment', { exact: true });
13
+ });
14
+
15
+ test('Renders with custom className', () => {
16
+ render(<MessageAttachmentItem className="custom-class">Test content</MessageAttachmentItem>);
17
+ expect(screen.getByText('Test content')).toHaveClass('custom-class');
18
+ });
19
+
20
+ test('Spreads additional props', () => {
21
+ render(<MessageAttachmentItem id="test-id">Test content</MessageAttachmentItem>);
22
+ expect(screen.getByText('Test content')).toHaveAttribute('id', 'test-id');
23
+ });
@@ -0,0 +1,25 @@
1
+ import { FunctionComponent, HTMLProps, ReactNode } from 'react';
2
+ import { css } from '@patternfly/react-styles';
3
+
4
+ /**
5
+ * The container for a single message attachment item, typically the FileDetailsLabel component. You must wrap any attachment components in this container.
6
+ * Use this component within MessageAttachmentsContainer when passing children to Message to customize its structure.
7
+ */
8
+ export interface MessageAttachmentItemProps extends HTMLProps<HTMLDivElement> {
9
+ /** Content to render inside a single attachment container */
10
+ children: ReactNode;
11
+ /** Additional classes applied to the attachment container. */
12
+ className?: string;
13
+ }
14
+
15
+ export const MessageAttachmentItem: FunctionComponent<MessageAttachmentItemProps> = ({
16
+ children,
17
+ className,
18
+ ...props
19
+ }) => (
20
+ <div className={css('pf-chatbot__message-attachment', className)} {...props}>
21
+ {children}
22
+ </div>
23
+ );
24
+
25
+ export default MessageAttachmentItem;
@@ -0,0 +1,23 @@
1
+ import '@testing-library/jest-dom';
2
+ import { render, screen } from '@testing-library/react';
3
+ import MessageAttachmentsContainer from './MessageAttachmentsContainer';
4
+
5
+ test('Renders with children', () => {
6
+ render(<MessageAttachmentsContainer>Test content</MessageAttachmentsContainer>);
7
+ expect(screen.getByText('Test content')).toBeInTheDocument();
8
+ });
9
+
10
+ test('Renders with pf-chatbot__message-attachments-container class by default', () => {
11
+ render(<MessageAttachmentsContainer>Test content</MessageAttachmentsContainer>);
12
+ expect(screen.getByText('Test content')).toHaveClass('pf-chatbot__message-attachments-container', { exact: true });
13
+ });
14
+
15
+ test('Renders with custom className', () => {
16
+ render(<MessageAttachmentsContainer className="custom-class">Test content</MessageAttachmentsContainer>);
17
+ expect(screen.getByText('Test content')).toHaveClass('custom-class');
18
+ });
19
+
20
+ test('Spreads additional props', () => {
21
+ render(<MessageAttachmentsContainer id="test-id">Test content</MessageAttachmentsContainer>);
22
+ expect(screen.getByText('Test content')).toHaveAttribute('id', 'test-id');
23
+ });
@@ -0,0 +1,25 @@
1
+ import { FunctionComponent, HTMLProps, ReactNode } from 'react';
2
+ import { css } from '@patternfly/react-styles';
3
+
4
+ /**
5
+ * The container to wrap MessageAttachment components. You must wrap any MessageAttachment components in this container.
6
+ * Use this component when passing children to Message to customize its structure.
7
+ */
8
+ export interface MessageAttachmentsContainerProps extends HTMLProps<HTMLDivElement> {
9
+ /** Content to render inside the attachments container */
10
+ children: ReactNode;
11
+ /** Additional classes applied to the attachments container. */
12
+ className?: string;
13
+ }
14
+
15
+ export const MessageAttachmentsContainer: FunctionComponent<MessageAttachmentsContainerProps> = ({
16
+ children,
17
+ className,
18
+ ...props
19
+ }) => (
20
+ <div className={css('pf-chatbot__message-attachments-container', className)} {...props}>
21
+ {children}
22
+ </div>
23
+ );
24
+
25
+ export default MessageAttachmentsContainer;
@@ -0,0 +1,2 @@
1
+ export * from './MessageAttachmentItem';
2
+ export * from './MessageAttachmentsContainer';
@@ -22,7 +22,7 @@ export interface MessageInputProps extends FormProps {
22
22
  content?: string;
23
23
  }
24
24
 
25
- const MessageInput: FunctionComponent<MessageInputProps> = ({
25
+ export const MessageInput: FunctionComponent<MessageInputProps> = ({
26
26
  editPlaceholder = 'Edit prompt message...',
27
27
  updateWord = 'Update',
28
28
  cancelWord = 'Cancel',