@patternfly/chatbot 6.5.0-prerelease.8 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +9 -1
  2. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -2
  3. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +38 -0
  4. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +29 -2
  5. package/dist/cjs/CodeModal/CodeModal.d.ts +2 -0
  6. package/dist/cjs/CodeModal/CodeModal.js +53 -12
  7. package/dist/cjs/DeepThinking/DeepThinking.d.ts +13 -0
  8. package/dist/cjs/DeepThinking/DeepThinking.js +31 -3
  9. package/dist/cjs/DeepThinking/DeepThinking.test.js +80 -0
  10. package/dist/cjs/MarkdownContent/MarkdownContent.d.ts +44 -0
  11. package/dist/cjs/MarkdownContent/MarkdownContent.js +181 -0
  12. package/dist/cjs/MarkdownContent/MarkdownContent.test.d.ts +1 -0
  13. package/dist/cjs/MarkdownContent/MarkdownContent.test.js +192 -0
  14. package/dist/cjs/MarkdownContent/index.d.ts +2 -0
  15. package/dist/cjs/MarkdownContent/index.js +23 -0
  16. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.d.ts +3 -1
  17. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.js +15 -4
  18. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +1 -0
  19. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.js +131 -0
  20. package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
  21. package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +5 -3
  22. package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
  23. package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.js +30 -0
  24. package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +5 -1
  25. package/dist/cjs/Message/LinkMessage/LinkMessage.js +4 -3
  26. package/dist/cjs/Message/ListMessage/OrderedListMessage.d.ts +9 -1
  27. package/dist/cjs/Message/ListMessage/OrderedListMessage.js +2 -1
  28. package/dist/cjs/Message/ListMessage/UnorderedListMessage.d.ts +7 -1
  29. package/dist/cjs/Message/ListMessage/UnorderedListMessage.js +2 -1
  30. package/dist/cjs/Message/Message.d.ts +20 -3
  31. package/dist/cjs/Message/Message.js +7 -160
  32. package/dist/cjs/Message/Message.test.js +129 -2
  33. package/dist/cjs/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
  34. package/dist/cjs/Message/MessageAndActions/MessageAndActions.js +22 -0
  35. package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
  36. package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.js +25 -0
  37. package/dist/cjs/Message/MessageAndActions/index.d.ts +1 -0
  38. package/dist/cjs/Message/MessageAndActions/index.js +17 -0
  39. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
  40. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.js +22 -0
  41. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
  42. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.js +25 -0
  43. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
  44. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.js +22 -0
  45. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
  46. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.js +25 -0
  47. package/dist/cjs/Message/MessageAttachments/index.d.ts +2 -0
  48. package/dist/cjs/Message/MessageAttachments/index.js +18 -0
  49. package/dist/cjs/Message/MessageInput.d.ts +1 -1
  50. package/dist/cjs/Message/MessageInput.js +3 -1
  51. package/dist/cjs/Message/MessageLoading.d.ts +13 -4
  52. package/dist/cjs/Message/MessageLoading.js +19 -5
  53. package/dist/cjs/Message/MessageLoading.test.d.ts +1 -0
  54. package/dist/cjs/Message/MessageLoading.test.js +25 -0
  55. package/dist/cjs/Message/QuickResponse/QuickResponse.js +3 -2
  56. package/dist/cjs/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
  57. package/dist/cjs/Message/QuickResponse/QuickResponse.test.js +109 -0
  58. package/dist/cjs/Message/QuickResponse/index.d.ts +1 -0
  59. package/dist/cjs/Message/QuickResponse/index.js +17 -0
  60. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +1 -1
  61. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +3 -2
  62. package/dist/cjs/Message/QuickStarts/index.d.ts +2 -0
  63. package/dist/cjs/Message/QuickStarts/index.js +18 -0
  64. package/dist/cjs/Message/TableMessage/TableMessage.d.ts +6 -1
  65. package/dist/cjs/Message/TableMessage/TableMessage.js +3 -2
  66. package/dist/cjs/Message/TextMessage/TextMessage.d.ts +8 -1
  67. package/dist/cjs/Message/TextMessage/TextMessage.js +3 -2
  68. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +3 -1
  69. package/dist/cjs/Message/UserFeedback/UserFeedback.js +8 -6
  70. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
  71. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +3 -2
  72. package/dist/cjs/Message/UserFeedback/index.d.ts +2 -0
  73. package/dist/cjs/Message/UserFeedback/index.js +18 -0
  74. package/dist/cjs/Message/index.d.ts +8 -0
  75. package/dist/cjs/Message/index.js +8 -0
  76. package/dist/cjs/MessageBar/MessageBar.d.ts +4 -0
  77. package/dist/cjs/MessageBar/MessageBar.js +20 -5
  78. package/dist/cjs/MessageBar/MessageBar.test.js +8 -0
  79. package/dist/cjs/Onboarding/Onboarding.d.ts +36 -0
  80. package/dist/cjs/Onboarding/Onboarding.js +37 -0
  81. package/dist/cjs/Onboarding/Onboarding.test.d.ts +1 -0
  82. package/dist/cjs/Onboarding/Onboarding.test.js +80 -0
  83. package/dist/cjs/Onboarding/index.d.ts +2 -0
  84. package/dist/cjs/Onboarding/index.js +23 -0
  85. package/dist/cjs/ResponseActions/ResponseActions.d.ts +7 -0
  86. package/dist/cjs/ResponseActions/ResponseActions.js +28 -7
  87. package/dist/cjs/ResponseActions/ResponseActions.test.js +67 -12
  88. package/dist/cjs/ResponseActions/ResponseActionsGroups.d.ts +13 -0
  89. package/dist/cjs/ResponseActions/ResponseActionsGroups.js +22 -0
  90. package/dist/cjs/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
  91. package/dist/cjs/ResponseActions/ResponseActionsGroups.test.js +25 -0
  92. package/dist/cjs/ResponseActions/index.d.ts +1 -0
  93. package/dist/cjs/ResponseActions/index.js +1 -0
  94. package/dist/cjs/ToolCall/ToolCall.d.ts +11 -0
  95. package/dist/cjs/ToolCall/ToolCall.js +24 -3
  96. package/dist/cjs/ToolCall/ToolCall.test.js +57 -0
  97. package/dist/cjs/ToolResponse/ToolResponse.d.ts +17 -0
  98. package/dist/cjs/ToolResponse/ToolResponse.js +49 -3
  99. package/dist/cjs/ToolResponse/ToolResponse.test.js +100 -0
  100. package/dist/cjs/index.d.ts +4 -0
  101. package/dist/cjs/index.js +7 -1
  102. package/dist/css/main.css +268 -30
  103. package/dist/css/main.css.map +1 -1
  104. package/dist/dynamic/MarkdownContent/package.json +1 -0
  105. package/dist/dynamic/Onboarding/package.json +1 -0
  106. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +9 -1
  107. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +10 -3
  108. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +38 -0
  109. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +30 -3
  110. package/dist/esm/CodeModal/CodeModal.d.ts +2 -0
  111. package/dist/esm/CodeModal/CodeModal.js +54 -13
  112. package/dist/esm/DeepThinking/DeepThinking.d.ts +13 -0
  113. package/dist/esm/DeepThinking/DeepThinking.js +28 -3
  114. package/dist/esm/DeepThinking/DeepThinking.test.js +80 -0
  115. package/dist/esm/MarkdownContent/MarkdownContent.d.ts +44 -0
  116. package/dist/esm/MarkdownContent/MarkdownContent.js +174 -0
  117. package/dist/esm/MarkdownContent/MarkdownContent.test.d.ts +1 -0
  118. package/dist/esm/MarkdownContent/MarkdownContent.test.js +187 -0
  119. package/dist/esm/MarkdownContent/index.d.ts +2 -0
  120. package/dist/esm/MarkdownContent/index.js +2 -0
  121. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.d.ts +3 -1
  122. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.js +15 -4
  123. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +1 -0
  124. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.js +126 -0
  125. package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
  126. package/dist/esm/Message/ErrorMessage/ErrorMessage.js +3 -3
  127. package/dist/esm/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
  128. package/dist/esm/Message/ErrorMessage/ErrorMessage.test.js +25 -0
  129. package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +5 -1
  130. package/dist/esm/Message/LinkMessage/LinkMessage.js +4 -3
  131. package/dist/esm/Message/ListMessage/OrderedListMessage.d.ts +9 -1
  132. package/dist/esm/Message/ListMessage/OrderedListMessage.js +2 -1
  133. package/dist/esm/Message/ListMessage/UnorderedListMessage.d.ts +7 -1
  134. package/dist/esm/Message/ListMessage/UnorderedListMessage.js +2 -1
  135. package/dist/esm/Message/Message.d.ts +20 -3
  136. package/dist/esm/Message/Message.js +8 -161
  137. package/dist/esm/Message/Message.test.js +129 -2
  138. package/dist/esm/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
  139. package/dist/esm/Message/MessageAndActions/MessageAndActions.js +18 -0
  140. package/dist/esm/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
  141. package/dist/esm/Message/MessageAndActions/MessageAndActions.test.js +20 -0
  142. package/dist/esm/Message/MessageAndActions/index.d.ts +1 -0
  143. package/dist/esm/Message/MessageAndActions/index.js +1 -0
  144. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
  145. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.js +18 -0
  146. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
  147. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.js +20 -0
  148. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
  149. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.js +18 -0
  150. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
  151. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.js +20 -0
  152. package/dist/esm/Message/MessageAttachments/index.d.ts +2 -0
  153. package/dist/esm/Message/MessageAttachments/index.js +2 -0
  154. package/dist/esm/Message/MessageInput.d.ts +1 -1
  155. package/dist/esm/Message/MessageInput.js +1 -1
  156. package/dist/esm/Message/MessageLoading.d.ts +13 -4
  157. package/dist/esm/Message/MessageLoading.js +16 -4
  158. package/dist/esm/Message/MessageLoading.test.d.ts +1 -0
  159. package/dist/esm/Message/MessageLoading.test.js +20 -0
  160. package/dist/esm/Message/QuickResponse/QuickResponse.js +3 -2
  161. package/dist/esm/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
  162. package/dist/esm/Message/QuickResponse/QuickResponse.test.js +104 -0
  163. package/dist/esm/Message/QuickResponse/index.d.ts +1 -0
  164. package/dist/esm/Message/QuickResponse/index.js +1 -0
  165. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +1 -1
  166. package/dist/esm/Message/QuickStarts/QuickStartTile.js +1 -1
  167. package/dist/esm/Message/QuickStarts/index.d.ts +2 -0
  168. package/dist/esm/Message/QuickStarts/index.js +2 -0
  169. package/dist/esm/Message/TableMessage/TableMessage.d.ts +6 -1
  170. package/dist/esm/Message/TableMessage/TableMessage.js +3 -2
  171. package/dist/esm/Message/TextMessage/TextMessage.d.ts +8 -1
  172. package/dist/esm/Message/TextMessage/TextMessage.js +3 -2
  173. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +3 -1
  174. package/dist/esm/Message/UserFeedback/UserFeedback.js +7 -7
  175. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
  176. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +1 -2
  177. package/dist/esm/Message/UserFeedback/index.d.ts +2 -0
  178. package/dist/esm/Message/UserFeedback/index.js +2 -0
  179. package/dist/esm/Message/index.d.ts +8 -0
  180. package/dist/esm/Message/index.js +8 -0
  181. package/dist/esm/MessageBar/MessageBar.d.ts +4 -0
  182. package/dist/esm/MessageBar/MessageBar.js +20 -5
  183. package/dist/esm/MessageBar/MessageBar.test.js +8 -0
  184. package/dist/esm/Onboarding/Onboarding.d.ts +36 -0
  185. package/dist/esm/Onboarding/Onboarding.js +30 -0
  186. package/dist/esm/Onboarding/Onboarding.test.d.ts +1 -0
  187. package/dist/esm/Onboarding/Onboarding.test.js +75 -0
  188. package/dist/esm/Onboarding/index.d.ts +2 -0
  189. package/dist/esm/Onboarding/index.js +2 -0
  190. package/dist/esm/ResponseActions/ResponseActions.d.ts +7 -0
  191. package/dist/esm/ResponseActions/ResponseActions.js +28 -7
  192. package/dist/esm/ResponseActions/ResponseActions.test.js +67 -12
  193. package/dist/esm/ResponseActions/ResponseActionsGroups.d.ts +13 -0
  194. package/dist/esm/ResponseActions/ResponseActionsGroups.js +18 -0
  195. package/dist/esm/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
  196. package/dist/esm/ResponseActions/ResponseActionsGroups.test.js +20 -0
  197. package/dist/esm/ResponseActions/index.d.ts +1 -0
  198. package/dist/esm/ResponseActions/index.js +1 -0
  199. package/dist/esm/ToolCall/ToolCall.d.ts +11 -0
  200. package/dist/esm/ToolCall/ToolCall.js +21 -3
  201. package/dist/esm/ToolCall/ToolCall.test.js +57 -0
  202. package/dist/esm/ToolResponse/ToolResponse.d.ts +17 -0
  203. package/dist/esm/ToolResponse/ToolResponse.js +46 -3
  204. package/dist/esm/ToolResponse/ToolResponse.test.js +100 -0
  205. package/dist/esm/index.d.ts +4 -0
  206. package/dist/esm/index.js +4 -0
  207. package/dist/tsconfig.tsbuildinfo +1 -1
  208. package/package.json +13 -3
  209. package/patternfly-docs/content/extensions/chatbot/chatbot.md +57 -0
  210. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +12 -12
  211. package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +1 -1
  212. package/patternfly-docs/content/extensions/chatbot/examples/Customizing Messages/Customizing Messages.md +1 -1
  213. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +1 -0
  214. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomStructure.tsx +102 -0
  215. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithDeepThinking.tsx +25 -11
  216. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +14 -1
  217. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownDeepThinking.tsx +26 -0
  218. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownToolCall.tsx +29 -0
  219. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownToolResponse.tsx +200 -0
  220. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMultipleActionGroups.tsx +61 -0
  221. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithPersistedActions.tsx +22 -0
  222. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +11 -0
  223. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolCall.tsx +14 -1
  224. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolResponse.tsx +222 -105
  225. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +123 -14
  226. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +1 -0
  227. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSearchActions.tsx +198 -0
  228. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarIndicatorThinking.tsx +15 -0
  229. package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactOnboarding.tsx +141 -0
  230. package/patternfly-docs/content/extensions/chatbot/examples/UI/Onboarding.tsx +151 -0
  231. package/patternfly-docs/content/extensions/chatbot/examples/UI/RH-Hat-Image.svg +9 -0
  232. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +67 -29
  233. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +18 -18
  234. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +33 -19
  235. package/patternfly-docs/patternfly-docs.config.js +1 -1
  236. package/patternfly-docs/patternfly-docs.source.js +1 -1
  237. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +43 -0
  238. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +95 -0
  239. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +51 -15
  240. package/src/ChatbotHeader/ChatbotHeader.scss +4 -0
  241. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +56 -14
  242. package/src/ChatbotModal/ChatbotModal.scss +3 -0
  243. package/src/CodeModal/CodeModal.tsx +71 -26
  244. package/src/DeepThinking/DeepThinking.scss +1 -1
  245. package/src/DeepThinking/DeepThinking.test.tsx +109 -0
  246. package/src/DeepThinking/DeepThinking.tsx +54 -5
  247. package/src/MarkdownContent/MarkdownContent.test.tsx +207 -0
  248. package/src/MarkdownContent/MarkdownContent.tsx +269 -0
  249. package/src/MarkdownContent/index.ts +2 -0
  250. package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +13 -0
  251. package/src/Message/CodeBlockMessage/CodeBlockMessage.test.tsx +171 -0
  252. package/src/Message/CodeBlockMessage/CodeBlockMessage.tsx +17 -4
  253. package/src/Message/ErrorMessage/ErrorMessage.test.tsx +38 -0
  254. package/src/Message/ErrorMessage/ErrorMessage.tsx +17 -2
  255. package/src/Message/LinkMessage/LinkMessage.scss +5 -0
  256. package/src/Message/LinkMessage/LinkMessage.tsx +24 -2
  257. package/src/Message/ListMessage/ListMessage.scss +8 -0
  258. package/src/Message/ListMessage/OrderedListMessage.tsx +16 -2
  259. package/src/Message/ListMessage/UnorderedListMessage.tsx +12 -2
  260. package/src/Message/Message.scss +11 -7
  261. package/src/Message/Message.test.tsx +202 -2
  262. package/src/Message/Message.tsx +129 -241
  263. package/src/Message/MessageAndActions/MessageAndActions.test.tsx +23 -0
  264. package/src/Message/MessageAndActions/MessageAndActions.tsx +22 -0
  265. package/src/Message/MessageAndActions/index.ts +1 -0
  266. package/src/Message/MessageAttachments/MessageAttachmentItem.test.tsx +23 -0
  267. package/src/Message/MessageAttachments/MessageAttachmentItem.tsx +25 -0
  268. package/src/Message/MessageAttachments/MessageAttachmentsContainer.test.tsx +23 -0
  269. package/src/Message/MessageAttachments/MessageAttachmentsContainer.tsx +25 -0
  270. package/src/Message/MessageAttachments/index.ts +2 -0
  271. package/src/Message/MessageInput.tsx +1 -1
  272. package/src/Message/MessageLoading.test.tsx +23 -0
  273. package/src/Message/MessageLoading.tsx +17 -2
  274. package/src/Message/QuickResponse/QuickResponse.scss +3 -1
  275. package/src/Message/QuickResponse/QuickResponse.test.tsx +131 -0
  276. package/src/Message/QuickResponse/QuickResponse.tsx +3 -2
  277. package/src/Message/QuickResponse/index.ts +1 -0
  278. package/src/Message/QuickStarts/QuickStartTile.tsx +1 -1
  279. package/src/Message/QuickStarts/index.ts +2 -0
  280. package/src/Message/TableMessage/TableMessage.scss +13 -1
  281. package/src/Message/TableMessage/TableMessage.tsx +18 -2
  282. package/src/Message/TextMessage/TextMessage.scss +12 -0
  283. package/src/Message/TextMessage/TextMessage.tsx +29 -2
  284. package/src/Message/UserFeedback/UserFeedback.scss +28 -1
  285. package/src/Message/UserFeedback/UserFeedback.tsx +23 -13
  286. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +1 -4
  287. package/src/Message/UserFeedback/index.ts +2 -0
  288. package/src/Message/index.ts +8 -0
  289. package/src/MessageBar/AttachButton.scss +0 -1
  290. package/src/MessageBar/MessageBar.scss +48 -6
  291. package/src/MessageBar/MessageBar.test.tsx +12 -0
  292. package/src/MessageBar/MessageBar.tsx +38 -4
  293. package/src/MessageBar/MicrophoneButton.scss +0 -1
  294. package/src/MessageBar/SendButton.scss +0 -1
  295. package/src/MessageBar/StopButton.scss +0 -1
  296. package/src/Onboarding/Onboarding.scss +101 -0
  297. package/src/Onboarding/Onboarding.test.tsx +148 -0
  298. package/src/Onboarding/Onboarding.tsx +126 -0
  299. package/src/Onboarding/index.ts +3 -0
  300. package/src/ResponseActions/ResponseActions.scss +12 -1
  301. package/src/ResponseActions/ResponseActions.test.tsx +111 -12
  302. package/src/ResponseActions/ResponseActions.tsx +44 -10
  303. package/src/ResponseActions/ResponseActionsGroups.test.tsx +23 -0
  304. package/src/ResponseActions/ResponseActionsGroups.tsx +28 -0
  305. package/src/ResponseActions/index.ts +1 -0
  306. package/src/ToolCall/ToolCall.scss +1 -1
  307. package/src/ToolCall/ToolCall.test.tsx +91 -0
  308. package/src/ToolCall/ToolCall.tsx +49 -4
  309. package/src/ToolResponse/ToolResponse.scss +13 -3
  310. package/src/ToolResponse/ToolResponse.test.tsx +119 -0
  311. package/src/ToolResponse/ToolResponse.tsx +82 -7
  312. package/src/index.ts +6 -0
  313. package/src/main.scss +2 -0
  314. package/tsconfig.json +1 -1
  315. 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" */
@@ -194,6 +195,7 @@ export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
194
195
  }
195
196
 
196
197
  export const MessageBase: FunctionComponent<MessageProps> = ({
198
+ children,
197
199
  role,
198
200
  content,
199
201
  extraContent,
@@ -202,6 +204,7 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
202
204
  timestamp,
203
205
  isLoading,
204
206
  actions,
207
+ persistActionSelection,
205
208
  sources,
206
209
  botWord = 'AI',
207
210
  loadingWord = 'Loading message',
@@ -248,14 +251,8 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
248
251
  }, [content]);
249
252
 
250
253
  const { beforeMainContent, afterMainContent, endContent } = extraContent || {};
251
- let rehypePlugins: PluggableList = [rehypeUnwrapImages, rehypeMoveImagesOutOfParagraphs, rehypeHighlight];
252
- if (openLinkInNewTab) {
253
- rehypePlugins = rehypePlugins.concat([[rehypeExternalLinks, { target: '_blank' }, rehypeSanitize]]);
254
- }
255
- if (additionalRehypePlugins) {
256
- rehypePlugins.push(...additionalRehypePlugins);
257
- }
258
- let avatarClassName;
254
+
255
+ let avatarClassName: string | undefined;
259
256
  if (avatarProps && 'className' in avatarProps) {
260
257
  const { className, ...rest } = avatarProps;
261
258
  avatarClassName = className;
@@ -265,157 +262,22 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
265
262
  const date = new Date();
266
263
  const dateString = timestamp ?? `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
267
264
 
268
- const disallowedElements = role === 'user' && hasNoImagesInUserMessages ? ['img'] : [];
269
- if (reactMarkdownProps && reactMarkdownProps.disallowedElements) {
270
- disallowedElements.push(...reactMarkdownProps.disallowedElements);
271
- }
272
-
273
- const handleMarkdown = () => {
274
- if (isMarkdownDisabled) {
275
- return (
276
- <TextMessage component={ContentVariants.p} {...props}>
277
- {messageText}
278
- </TextMessage>
279
- );
280
- }
281
- return (
282
- <Markdown
283
- components={{
284
- section: (props) => {
285
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
286
- const { node, ...rest } = props;
287
- return <section {...rest} className={`pf-chatbot__message-text ${rest?.className}`} />;
288
- },
289
- p: (props) => {
290
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
291
- const { node, ...rest } = props;
292
- return <TextMessage component={ContentVariants.p} {...rest} isPrimary={isPrimary} />;
293
- },
294
- code: ({ children, ...props }) => {
295
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
296
- const { node, ...codeProps } = props;
297
- return (
298
- <CodeBlockMessage {...codeProps} {...codeBlockProps} isPrimary={isPrimary}>
299
- {children}
300
- </CodeBlockMessage>
301
- );
302
- },
303
- h1: (props) => {
304
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
305
- const { node, ...rest } = props;
306
- return <TextMessage component={ContentVariants.h1} {...rest} />;
307
- },
308
- h2: (props) => {
309
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
310
- const { node, ...rest } = props;
311
- return <TextMessage component={ContentVariants.h2} {...rest} />;
312
- },
313
- h3: (props) => {
314
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
315
- const { node, ...rest } = props;
316
- return <TextMessage component={ContentVariants.h3} {...rest} />;
317
- },
318
- h4: (props) => {
319
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
320
- const { node, ...rest } = props;
321
- return <TextMessage component={ContentVariants.h4} {...rest} />;
322
- },
323
- h5: (props) => {
324
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
325
- const { node, ...rest } = props;
326
- return <TextMessage component={ContentVariants.h5} {...rest} />;
327
- },
328
- h6: (props) => {
329
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
330
- const { node, ...rest } = props;
331
- return <TextMessage component={ContentVariants.h6} {...rest} />;
332
- },
333
- blockquote: (props) => {
334
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
335
- const { node, ...rest } = props;
336
- return <TextMessage component={ContentVariants.blockquote} {...rest} />;
337
- },
338
- ul: (props) => {
339
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
340
- const { node, ...rest } = props;
341
- return <UnorderedListMessage {...rest} />;
342
- },
343
- ol: (props) => {
344
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
345
- const { node, ...rest } = props;
346
- return <OrderedListMessage {...rest} />;
347
- },
348
- li: (props) => {
349
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
350
- const { node, ...rest } = props;
351
- return <ListItemMessage {...rest} />;
352
- },
353
- // table requires node attribute for calculating headers for mobile breakpoint
354
- table: (props) => <TableMessage {...props} {...tableProps} isPrimary={isPrimary} />,
355
- tbody: (props) => {
356
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
357
- const { node, ...rest } = props;
358
- return <TbodyMessage {...rest} />;
359
- },
360
- thead: (props) => {
361
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
362
- const { node, ...rest } = props;
363
- return <TheadMessage {...rest} />;
364
- },
365
- tr: (props) => {
366
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
367
- const { node, ...rest } = props;
368
- return <TrMessage {...rest} />;
369
- },
370
- td: (props) => {
371
- // Conflicts with Td type
372
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
373
- const { node, width, ...rest } = props;
374
- return <TdMessage {...rest} />;
375
- },
376
- th: (props) => {
377
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
378
- const { node, ...rest } = props;
379
- return <ThMessage {...rest} />;
380
- },
381
- img: (props) => {
382
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
383
- const { node, ...rest } = props;
384
- return <ImageMessage {...rest} />;
385
- },
386
- a: (props) => {
387
- // node is just the details of the document structure - not needed
388
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
389
- const { node, ...rest } = props;
390
- return (
391
- // some a types conflict with ButtonProps, but it's ok because we are using an a tag
392
- // there are too many to handle manually
393
- <LinkMessage {...(rest as any)} {...linkProps}>
394
- {props.children}
395
- </LinkMessage>
396
- );
397
- },
398
- // used for footnotes
399
- sup: (props) => {
400
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
401
- const { node, ...rest } = props;
402
- return <SuperscriptMessage {...rest} />;
403
- }
404
- }}
405
- remarkPlugins={[[remarkGfm, { ...remarkGfmProps }], ...additionalRemarkPlugins]}
406
- rehypePlugins={rehypePlugins}
407
- {...reactMarkdownProps}
408
- remarkRehypeOptions={{
409
- // removes sr-only class from footnote labels applied by default
410
- footnoteLabelProperties: { className: [''] },
411
- ...reactMarkdownProps?.remarkRehypeOptions
412
- }}
413
- disallowedElements={disallowedElements}
414
- >
415
- {messageText}
416
- </Markdown>
417
- );
418
- };
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
+ );
419
281
 
420
282
  const renderMessage = () => {
421
283
  if (isLoading) {
@@ -459,12 +321,14 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
459
321
  {...props}
460
322
  >
461
323
  {/* We are using an empty alt tag intentionally in order to reduce noise on screen readers */}
462
- <Avatar
463
- className={`pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`}
464
- src={avatar}
465
- alt=""
466
- {...avatarProps}
467
- />
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
+ )}
468
332
  <div className="pf-chatbot__message-contents">
469
333
  <div className="pf-chatbot__message-meta">
470
334
  {name && (
@@ -480,58 +344,82 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
480
344
  <Timestamp date={date}>{timestamp}</Timestamp>
481
345
  </div>
482
346
  <div className="pf-chatbot__message-response">
483
- <div className="pf-chatbot__message-and-actions">
484
- {renderMessage()}
485
- {afterMainContent && <>{afterMainContent}</>}
486
- {toolResponse && <ToolResponse {...toolResponse} />}
487
- {deepThinking && <DeepThinking {...deepThinking} />}
488
- {toolCall && <ToolCall {...toolCall} />}
489
- {!isLoading && sources && <SourcesCard {...sources} isCompact={isCompact} />}
490
- {quickStarts && quickStarts.quickStart && (
491
- <QuickStartTile
492
- quickStart={quickStarts.quickStart}
493
- onSelectQuickStart={quickStarts.onSelectQuickStart}
494
- minuteWord={quickStarts.minuteWord}
495
- minuteWordPlural={quickStarts.minuteWordPlural}
496
- prerequisiteWord={quickStarts.prerequisiteWord}
497
- prerequisiteWordPlural={quickStarts.prerequisiteWordPlural}
498
- quickStartButtonAriaLabel={quickStarts.quickStartButtonAriaLabel}
499
- isCompact={isCompact}
500
- />
501
- )}
502
- {!isLoading && !isEditable && actions && <ResponseActions actions={actions} />}
503
- {userFeedbackForm && <UserFeedback {...userFeedbackForm} timestamp={dateString} isCompact={isCompact} />}
504
- {userFeedbackComplete && (
505
- <UserFeedbackComplete {...userFeedbackComplete} timestamp={dateString} isCompact={isCompact} />
506
- )}
507
- {!isLoading && quickResponses && (
508
- <QuickResponse
509
- quickResponses={quickResponses}
510
- quickResponseContainerProps={quickResponseContainerProps}
511
- isCompact={isCompact}
512
- />
513
- )}
514
- </div>
515
- {attachments && (
516
- <div className="pf-chatbot__message-attachments-container">
517
- {attachments.map((attachment) => (
518
- <div key={attachment.id ?? attachment.name} className="pf-chatbot__message-attachment">
519
- <FileDetailsLabel
520
- fileName={attachment.name}
521
- fileId={attachment.id}
522
- onClose={attachment.onClose}
523
- onClick={attachment.onClick}
524
- isLoading={attachment.isLoading}
525
- closeButtonAriaLabel={attachment.closeButtonAriaLabel}
526
- languageTestId={attachment.languageTestId}
527
- spinnerTestId={attachment.spinnerTestId}
528
- variant={isPrimary ? 'outline' : undefined}
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}
529
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
+ ))}
530
418
  </div>
531
- ))}
532
- </div>
419
+ )}
420
+ {!isLoading && endContent && <>{endContent}</>}
421
+ </>
533
422
  )}
534
- {!isLoading && endContent && <>{endContent}</>}
535
423
  </div>
536
424
  </div>
537
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',
@@ -0,0 +1,23 @@
1
+ import '@testing-library/jest-dom';
2
+ import { render, screen } from '@testing-library/react';
3
+ import MessageLoading from './MessageLoading';
4
+
5
+ test('Renders with pf-chatbot__message-loading class by default', () => {
6
+ render(<MessageLoading data-testid="test-id" />);
7
+ expect(screen.getByTestId('test-id')).toHaveClass('pf-chatbot__message-loading', { exact: true });
8
+ });
9
+
10
+ test('Renders with pf-m-primary class when isPrimary is true', () => {
11
+ render(<MessageLoading data-testid="test-id" isPrimary />);
12
+ expect(screen.getByTestId('test-id')).toHaveClass('pf-chatbot__message-loading pf-m-primary');
13
+ });
14
+
15
+ test('Renders loading word when loadingWord is passed', () => {
16
+ render(<MessageLoading loadingWord="Loading message" />);
17
+ expect(screen.getByText('Loading message')).toBeInTheDocument();
18
+ });
19
+
20
+ test('Spreads additional props', () => {
21
+ render(<MessageLoading data-testid="test-id" id="custom-id" />);
22
+ expect(screen.getByTestId('test-id')).toHaveAttribute('id', 'custom-id');
23
+ });