@patternfly/chatbot 6.5.0-prerelease.9 → 6.6.0-prerelease.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +10 -0
  77. package/dist/cjs/MessageBar/MessageBar.js +42 -10
  78. package/dist/cjs/MessageBar/MessageBar.test.js +20 -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 +276 -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 +10 -0
  182. package/dist/esm/MessageBar/MessageBar.js +42 -10
  183. package/dist/esm/MessageBar/MessageBar.test.js +20 -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/ChatbotMessageBarCustomActions.tsx +190 -0
  229. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarIndicatorThinking.tsx +15 -0
  230. package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactOnboarding.tsx +141 -0
  231. package/patternfly-docs/content/extensions/chatbot/examples/UI/Onboarding.tsx +151 -0
  232. package/patternfly-docs/content/extensions/chatbot/examples/UI/RH-Hat-Image.svg +9 -0
  233. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +81 -30
  234. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +18 -18
  235. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +33 -19
  236. package/patternfly-docs/patternfly-docs.config.js +1 -1
  237. package/patternfly-docs/patternfly-docs.source.js +1 -1
  238. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +43 -0
  239. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +95 -0
  240. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +51 -15
  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 +63 -7
  291. package/src/MessageBar/MessageBar.test.tsx +39 -0
  292. package/src/MessageBar/MessageBar.tsx +124 -48
  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
@@ -11,13 +11,15 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  return t;
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.ErrorMessage = void 0;
14
15
  const jsx_runtime_1 = require("react/jsx-runtime");
15
16
  // ============================================================================
16
17
  // Chatbot Main - Message - Content - Error
17
18
  // ============================================================================
18
19
  const react_core_1 = require("@patternfly/react-core");
19
20
  const ErrorMessage = (_a) => {
20
- var { title, actionLinks, children } = _a, props = __rest(_a, ["title", "actionLinks", "children"]);
21
- return ((0, jsx_runtime_1.jsx)(react_core_1.Alert, Object.assign({ isInline: true, variant: "danger", title: title, actionLinks: actionLinks }, props, { children: children })));
21
+ var { title, actionLinks, children, className } = _a, props = __rest(_a, ["title", "actionLinks", "children", "className"]);
22
+ return ((0, jsx_runtime_1.jsx)(react_core_1.Alert, Object.assign({ isInline: true, variant: "danger", title: title, actionLinks: actionLinks, className: className }, props, { children: children })));
22
23
  };
23
- exports.default = ErrorMessage;
24
+ exports.ErrorMessage = ErrorMessage;
25
+ exports.default = exports.ErrorMessage;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("@testing-library/react");
8
+ require("@testing-library/jest-dom");
9
+ const ErrorMessage_1 = __importDefault(require("./ErrorMessage"));
10
+ test('Renders with title', () => {
11
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(ErrorMessage_1.default, { title: "Error occurred" }));
12
+ expect(react_1.screen.getByText('Error occurred')).toBeVisible();
13
+ });
14
+ test('Renders with children', () => {
15
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(ErrorMessage_1.default, { title: "Error occurred", children: "This is the error message body" }));
16
+ expect(react_1.screen.getByText('This is the error message body')).toBeVisible();
17
+ });
18
+ test('Renders with action links', () => {
19
+ const actionLinks = ((0, jsx_runtime_1.jsx)("a", { href: "#retry", "data-testid": "retry-link", children: "Retry action link" }));
20
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(ErrorMessage_1.default, { title: "Error occurred", actionLinks: actionLinks }));
21
+ expect(react_1.screen.getByText('Retry action link')).toBeVisible();
22
+ });
23
+ test('Renders with custom className', () => {
24
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(ErrorMessage_1.default, { title: "Error occurred", className: "custom-error-class" }));
25
+ expect(react_1.screen.getByText('Error occurred').parentElement).toHaveClass('custom-error-class');
26
+ });
27
+ test('Renders with spread props', () => {
28
+ (0, react_1.render)((0, jsx_runtime_1.jsx)(ErrorMessage_1.default, { title: "Error occurred", id: "test-error-id" }));
29
+ expect(react_1.screen.getByText('Error occurred').parentElement).toHaveAttribute('id', 'test-error-id');
30
+ });
@@ -1,4 +1,8 @@
1
1
  import { ButtonProps } from '@patternfly/react-core';
2
2
  import { ExtraProps } from 'react-markdown';
3
- declare const LinkMessage: ({ children, target, href, id, ...props }: ButtonProps & ExtraProps) => import("react/jsx-runtime").JSX.Element;
3
+ export interface LinkMessageProps {
4
+ /** Flag indicating that the content should retain message styles when using Markdown. */
5
+ shouldRetainStyles?: boolean;
6
+ }
7
+ declare const LinkMessage: ({ children, target, href, id, shouldRetainStyles, ...props }: LinkMessageProps & ButtonProps & ExtraProps) => import("react/jsx-runtime").JSX.Element;
4
8
  export default LinkMessage;
@@ -17,15 +17,16 @@ const jsx_runtime_1 = require("react/jsx-runtime");
17
17
  // ============================================================================
18
18
  const react_core_1 = require("@patternfly/react-core");
19
19
  const react_icons_1 = require("@patternfly/react-icons");
20
+ const react_styles_1 = require("@patternfly/react-styles");
20
21
  const LinkMessage = (_a) => {
21
- var { children, target, href, id } = _a, props = __rest(_a, ["children", "target", "href", "id"]);
22
+ var { children, target, href, id, shouldRetainStyles } = _a, props = __rest(_a, ["children", "target", "href", "id", "shouldRetainStyles"]);
22
23
  if (target === '_blank') {
23
24
  return ((0, jsx_runtime_1.jsx)(react_core_1.Button, Object.assign({ component: "a", variant: "link", href: href, icon: (0, jsx_runtime_1.jsx)(react_icons_1.ExternalLinkSquareAltIcon, {}), iconPosition: "end", isInline: true, target: target,
24
25
  // need to explicitly call this out or id doesn't seem to get passed - required for footnotes
25
- id: id }, props, { children: children })));
26
+ id: id }, props, { className: (0, react_styles_1.css)(shouldRetainStyles && 'pf-m-markdown', props === null || props === void 0 ? void 0 : props.className), children: children })));
26
27
  }
27
28
  return (
28
29
  // need to explicitly call this out or id doesn't seem to get passed - required for footnotes
29
- (0, jsx_runtime_1.jsx)(react_core_1.Button, Object.assign({ isInline: true, component: "a", href: href, variant: "link", id: id }, props, { children: children })));
30
+ (0, jsx_runtime_1.jsx)(react_core_1.Button, Object.assign({ isInline: true, component: "a", href: href, variant: "link", id: id }, props, { className: (0, react_styles_1.css)(shouldRetainStyles && 'pf-m-markdown', props === null || props === void 0 ? void 0 : props.className), children: children })));
30
31
  };
31
32
  exports.default = LinkMessage;
@@ -1,3 +1,11 @@
1
1
  import { ExtraProps } from 'react-markdown';
2
- declare const OrderedListMessage: ({ children, start }: JSX.IntrinsicElements["ol"] & ExtraProps) => import("react/jsx-runtime").JSX.Element;
2
+ export interface OrderedListMessageProps {
3
+ /** The ordered list content */
4
+ children?: React.ReactNode;
5
+ /** The number to start the ordered list at. */
6
+ start?: number;
7
+ /** Flag indicating that the content should retain message styles when using Markdown. */
8
+ shouldRetainStyles?: boolean;
9
+ }
10
+ declare const OrderedListMessage: ({ children, start, shouldRetainStyles }: OrderedListMessageProps & JSX.IntrinsicElements["ol"] & ExtraProps) => import("react/jsx-runtime").JSX.Element;
3
11
  export default OrderedListMessage;
@@ -2,5 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const jsx_runtime_1 = require("react/jsx-runtime");
4
4
  const react_core_1 = require("@patternfly/react-core");
5
- const OrderedListMessage = ({ children, start }) => ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__message-ordered-list", children: (0, jsx_runtime_1.jsx)(react_core_1.List, { component: react_core_1.ListComponent.ol, type: react_core_1.OrderType.number, start: start, children: children }) }));
5
+ const react_styles_1 = require("@patternfly/react-styles");
6
+ const OrderedListMessage = ({ children, start, shouldRetainStyles }) => ((0, jsx_runtime_1.jsx)("div", { className: (0, react_styles_1.css)('pf-chatbot__message-ordered-list', shouldRetainStyles && 'pf-m-markdown'), children: (0, jsx_runtime_1.jsx)(react_core_1.List, { component: react_core_1.ListComponent.ol, type: react_core_1.OrderType.number, start: start, children: children }) }));
6
7
  exports.default = OrderedListMessage;
@@ -1,3 +1,9 @@
1
1
  import { ExtraProps } from 'react-markdown';
2
- declare const UnorderedListMessage: ({ children }: JSX.IntrinsicElements["ul"] & ExtraProps) => import("react/jsx-runtime").JSX.Element;
2
+ export interface UnrderedListMessageProps {
3
+ /** The ordered list content */
4
+ children?: React.ReactNode;
5
+ /** Flag indicating that the content should retain message styles when using Markdown. */
6
+ shouldRetainStyles?: boolean;
7
+ }
8
+ declare const UnorderedListMessage: ({ children, shouldRetainStyles }: UnrderedListMessageProps & JSX.IntrinsicElements["ul"] & ExtraProps) => import("react/jsx-runtime").JSX.Element;
3
9
  export default UnorderedListMessage;
@@ -2,5 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const jsx_runtime_1 = require("react/jsx-runtime");
4
4
  const react_core_1 = require("@patternfly/react-core");
5
- const UnorderedListMessage = ({ children }) => ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__message-unordered-list", children: (0, jsx_runtime_1.jsx)(react_core_1.List, { children: children }) }));
5
+ const react_styles_1 = require("@patternfly/react-styles");
6
+ const UnorderedListMessage = ({ children, shouldRetainStyles }) => ((0, jsx_runtime_1.jsx)("div", { className: (0, react_styles_1.css)('pf-chatbot__message-unordered-list', shouldRetainStyles && 'pf-m-markdown'), children: (0, jsx_runtime_1.jsx)(react_core_1.List, { children: children }) }));
6
7
  exports.default = UnorderedListMessage;
@@ -42,6 +42,8 @@ export interface MessageExtraContent {
42
42
  endContent?: ReactNode;
43
43
  }
44
44
  export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
45
+ /** 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. */
46
+ children?: ReactNode;
45
47
  /** Unique id for message */
46
48
  id?: string;
47
49
  /** Role of the user sending the message */
@@ -53,17 +55,32 @@ export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
53
55
  /** Name of the user */
54
56
  name?: string;
55
57
  /** Avatar src for the user */
56
- avatar: string;
58
+ avatar?: string;
57
59
  /** Timestamp for the message */
58
60
  timestamp?: string;
59
61
  /** Set this to true if message is being loaded */
60
62
  isLoading?: boolean;
61
63
  /** Array of attachments attached to a message */
62
64
  attachments?: MessageAttachment[];
63
- /** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen */
65
+ /** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen.
66
+ * 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
67
+ * an object that contains an actions property for finer control of selection persistence.
68
+ */
64
69
  actions?: {
65
70
  [key: string]: ActionProps;
66
- };
71
+ } | {
72
+ [key: string]: ActionProps;
73
+ }[] | {
74
+ actions: {
75
+ [key: string]: ActionProps;
76
+ };
77
+ persistActionSelection?: boolean;
78
+ }[];
79
+ /** When true, the selected action will persist even when clicking outside the component.
80
+ * When false (default), clicking outside or clicking another action will deselect the current selection.
81
+ * For finer control of multiple action groups, use persistActionSelection on each group.
82
+ */
83
+ persistActionSelection?: boolean;
67
84
  /** Sources for message */
68
85
  sources?: SourcesCardProps;
69
86
  /** Label for the English word "AI," used to tag messages with role "bot" */
@@ -20,57 +20,30 @@ const jsx_runtime_1 = require("react/jsx-runtime");
20
20
  // Chatbot Main - Message
21
21
  // ============================================================================
22
22
  const react_1 = require("react");
23
- const react_markdown_1 = __importDefault(require("react-markdown"));
24
- const remark_gfm_1 = __importDefault(require("remark-gfm"));
25
23
  const react_core_1 = require("@patternfly/react-core");
26
24
  const MessageLoading_1 = __importDefault(require("./MessageLoading"));
27
- const CodeBlockMessage_1 = __importDefault(require("./CodeBlockMessage/CodeBlockMessage"));
28
- const TextMessage_1 = __importDefault(require("./TextMessage/TextMessage"));
29
25
  const FileDetailsLabel_1 = __importDefault(require("../FileDetailsLabel/FileDetailsLabel"));
30
26
  const ResponseActions_1 = __importDefault(require("../ResponseActions/ResponseActions"));
31
27
  const SourcesCard_1 = __importDefault(require("../SourcesCard"));
32
- const ListItemMessage_1 = __importDefault(require("./ListMessage/ListItemMessage"));
33
- const UnorderedListMessage_1 = __importDefault(require("./ListMessage/UnorderedListMessage"));
34
- const OrderedListMessage_1 = __importDefault(require("./ListMessage/OrderedListMessage"));
35
28
  const QuickStartTile_1 = __importDefault(require("./QuickStarts/QuickStartTile"));
36
29
  const QuickResponse_1 = __importDefault(require("./QuickResponse/QuickResponse"));
37
30
  const UserFeedback_1 = __importDefault(require("./UserFeedback/UserFeedback"));
38
31
  const UserFeedbackComplete_1 = __importDefault(require("./UserFeedback/UserFeedbackComplete"));
39
- const TableMessage_1 = __importDefault(require("./TableMessage/TableMessage"));
40
- const TrMessage_1 = __importDefault(require("./TableMessage/TrMessage"));
41
- const TdMessage_1 = __importDefault(require("./TableMessage/TdMessage"));
42
- const TbodyMessage_1 = __importDefault(require("./TableMessage/TbodyMessage"));
43
- const TheadMessage_1 = __importDefault(require("./TableMessage/TheadMessage"));
44
- const ThMessage_1 = __importDefault(require("./TableMessage/ThMessage"));
45
- const ImageMessage_1 = __importDefault(require("./ImageMessage/ImageMessage"));
46
- const rehype_unwrap_images_1 = __importDefault(require("rehype-unwrap-images"));
47
- const rehype_external_links_1 = __importDefault(require("rehype-external-links"));
48
- const rehype_sanitize_1 = __importDefault(require("rehype-sanitize"));
49
- const rehype_highlight_1 = __importDefault(require("rehype-highlight"));
50
32
  // see the full list of styles here: https://highlightjs.org/examples
51
33
  require("highlight.js/styles/vs2015.css");
52
- const LinkMessage_1 = __importDefault(require("./LinkMessage/LinkMessage"));
53
34
  const ErrorMessage_1 = __importDefault(require("./ErrorMessage/ErrorMessage"));
54
35
  const MessageInput_1 = __importDefault(require("./MessageInput"));
55
- const rehypeMoveImagesOutOfParagraphs_1 = require("./Plugins/rehypeMoveImagesOutOfParagraphs");
56
36
  const ToolResponse_1 = __importDefault(require("../ToolResponse"));
57
37
  const DeepThinking_1 = __importDefault(require("../DeepThinking"));
58
- const SuperscriptMessage_1 = __importDefault(require("./SuperscriptMessage/SuperscriptMessage"));
59
38
  const ToolCall_1 = __importDefault(require("../ToolCall"));
39
+ const MarkdownContent_1 = __importDefault(require("../MarkdownContent"));
60
40
  const MessageBase = (_a) => {
61
- var { role, content, extraContent, name, avatar, timestamp, isLoading, actions, sources, botWord = 'AI', loadingWord = 'Loading message', codeBlockProps, quickResponses, quickResponseContainerProps = { numLabels: 5 }, attachments, hasRoundAvatar = true, avatarProps, quickStarts, userFeedbackForm, userFeedbackComplete, isLiveRegion = true, innerRef, tableProps, openLinkInNewTab = true, additionalRehypePlugins = [], additionalRemarkPlugins = [], linkProps, error, isEditable, editPlaceholder = 'Edit prompt message...', updateWord = 'Update', cancelWord = 'Cancel', onEditUpdate, onEditCancel, inputRef, editFormProps, isCompact, isMarkdownDisabled, reactMarkdownProps, toolResponse, deepThinking, remarkGfmProps, toolCall, hasNoImagesInUserMessages = true, isPrimary } = _a, props = __rest(_a, ["role", "content", "extraContent", "name", "avatar", "timestamp", "isLoading", "actions", "sources", "botWord", "loadingWord", "codeBlockProps", "quickResponses", "quickResponseContainerProps", "attachments", "hasRoundAvatar", "avatarProps", "quickStarts", "userFeedbackForm", "userFeedbackComplete", "isLiveRegion", "innerRef", "tableProps", "openLinkInNewTab", "additionalRehypePlugins", "additionalRemarkPlugins", "linkProps", "error", "isEditable", "editPlaceholder", "updateWord", "cancelWord", "onEditUpdate", "onEditCancel", "inputRef", "editFormProps", "isCompact", "isMarkdownDisabled", "reactMarkdownProps", "toolResponse", "deepThinking", "remarkGfmProps", "toolCall", "hasNoImagesInUserMessages", "isPrimary"]);
41
+ var { children, role, content, extraContent, name, avatar, timestamp, isLoading, actions, persistActionSelection, sources, botWord = 'AI', loadingWord = 'Loading message', codeBlockProps, quickResponses, quickResponseContainerProps = { numLabels: 5 }, attachments, hasRoundAvatar = true, avatarProps, quickStarts, userFeedbackForm, userFeedbackComplete, isLiveRegion = true, innerRef, tableProps, openLinkInNewTab = true, additionalRehypePlugins = [], additionalRemarkPlugins = [], linkProps, error, isEditable, editPlaceholder = 'Edit prompt message...', updateWord = 'Update', cancelWord = 'Cancel', onEditUpdate, onEditCancel, inputRef, editFormProps, isCompact, isMarkdownDisabled, reactMarkdownProps, toolResponse, deepThinking, remarkGfmProps, toolCall, hasNoImagesInUserMessages = true, isPrimary } = _a, props = __rest(_a, ["children", "role", "content", "extraContent", "name", "avatar", "timestamp", "isLoading", "actions", "persistActionSelection", "sources", "botWord", "loadingWord", "codeBlockProps", "quickResponses", "quickResponseContainerProps", "attachments", "hasRoundAvatar", "avatarProps", "quickStarts", "userFeedbackForm", "userFeedbackComplete", "isLiveRegion", "innerRef", "tableProps", "openLinkInNewTab", "additionalRehypePlugins", "additionalRemarkPlugins", "linkProps", "error", "isEditable", "editPlaceholder", "updateWord", "cancelWord", "onEditUpdate", "onEditCancel", "inputRef", "editFormProps", "isCompact", "isMarkdownDisabled", "reactMarkdownProps", "toolResponse", "deepThinking", "remarkGfmProps", "toolCall", "hasNoImagesInUserMessages", "isPrimary"]);
62
42
  const [messageText, setMessageText] = (0, react_1.useState)(content);
63
43
  (0, react_1.useEffect)(() => {
64
44
  setMessageText(content);
65
45
  }, [content]);
66
46
  const { beforeMainContent, afterMainContent, endContent } = extraContent || {};
67
- let rehypePlugins = [rehype_unwrap_images_1.default, rehypeMoveImagesOutOfParagraphs_1.rehypeMoveImagesOutOfParagraphs, rehype_highlight_1.default];
68
- if (openLinkInNewTab) {
69
- rehypePlugins = rehypePlugins.concat([[rehype_external_links_1.default, { target: '_blank' }, rehype_sanitize_1.default]]);
70
- }
71
- if (additionalRehypePlugins) {
72
- rehypePlugins.push(...additionalRehypePlugins);
73
- }
74
47
  let avatarClassName;
75
48
  if (avatarProps && 'className' in avatarProps) {
76
49
  const { className } = avatarProps, rest = __rest(avatarProps, ["className"]);
@@ -80,133 +53,7 @@ const MessageBase = (_a) => {
80
53
  // Keep timestamps consistent between Timestamp component and aria-label
81
54
  const date = new Date();
82
55
  const dateString = timestamp !== null && timestamp !== void 0 ? timestamp : `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
83
- const disallowedElements = role === 'user' && hasNoImagesInUserMessages ? ['img'] : [];
84
- if (reactMarkdownProps && reactMarkdownProps.disallowedElements) {
85
- disallowedElements.push(...reactMarkdownProps.disallowedElements);
86
- }
87
- const handleMarkdown = () => {
88
- if (isMarkdownDisabled) {
89
- return ((0, jsx_runtime_1.jsx)(TextMessage_1.default, Object.assign({ component: react_core_1.ContentVariants.p }, props, { children: messageText })));
90
- }
91
- return ((0, jsx_runtime_1.jsx)(react_markdown_1.default, Object.assign({ components: {
92
- section: (props) => {
93
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
94
- const { node } = props, rest = __rest(props, ["node"]);
95
- return (0, jsx_runtime_1.jsx)("section", Object.assign({}, rest, { className: `pf-chatbot__message-text ${rest === null || rest === void 0 ? void 0 : rest.className}` }));
96
- },
97
- p: (props) => {
98
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
99
- const { node } = props, rest = __rest(props, ["node"]);
100
- return (0, jsx_runtime_1.jsx)(TextMessage_1.default, Object.assign({ component: react_core_1.ContentVariants.p }, rest, { isPrimary: isPrimary }));
101
- },
102
- code: (_a) => {
103
- var { children } = _a, props = __rest(_a, ["children"]);
104
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
105
- const { node } = props, codeProps = __rest(props, ["node"]);
106
- return ((0, jsx_runtime_1.jsx)(CodeBlockMessage_1.default, Object.assign({}, codeProps, codeBlockProps, { isPrimary: isPrimary, children: children })));
107
- },
108
- h1: (props) => {
109
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
110
- const { node } = props, rest = __rest(props, ["node"]);
111
- return (0, jsx_runtime_1.jsx)(TextMessage_1.default, Object.assign({ component: react_core_1.ContentVariants.h1 }, rest));
112
- },
113
- h2: (props) => {
114
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
115
- const { node } = props, rest = __rest(props, ["node"]);
116
- return (0, jsx_runtime_1.jsx)(TextMessage_1.default, Object.assign({ component: react_core_1.ContentVariants.h2 }, rest));
117
- },
118
- h3: (props) => {
119
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
120
- const { node } = props, rest = __rest(props, ["node"]);
121
- return (0, jsx_runtime_1.jsx)(TextMessage_1.default, Object.assign({ component: react_core_1.ContentVariants.h3 }, rest));
122
- },
123
- h4: (props) => {
124
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
125
- const { node } = props, rest = __rest(props, ["node"]);
126
- return (0, jsx_runtime_1.jsx)(TextMessage_1.default, Object.assign({ component: react_core_1.ContentVariants.h4 }, rest));
127
- },
128
- h5: (props) => {
129
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
130
- const { node } = props, rest = __rest(props, ["node"]);
131
- return (0, jsx_runtime_1.jsx)(TextMessage_1.default, Object.assign({ component: react_core_1.ContentVariants.h5 }, rest));
132
- },
133
- h6: (props) => {
134
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
135
- const { node } = props, rest = __rest(props, ["node"]);
136
- return (0, jsx_runtime_1.jsx)(TextMessage_1.default, Object.assign({ component: react_core_1.ContentVariants.h6 }, rest));
137
- },
138
- blockquote: (props) => {
139
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
140
- const { node } = props, rest = __rest(props, ["node"]);
141
- return (0, jsx_runtime_1.jsx)(TextMessage_1.default, Object.assign({ component: react_core_1.ContentVariants.blockquote }, rest));
142
- },
143
- ul: (props) => {
144
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
145
- const { node } = props, rest = __rest(props, ["node"]);
146
- return (0, jsx_runtime_1.jsx)(UnorderedListMessage_1.default, Object.assign({}, rest));
147
- },
148
- ol: (props) => {
149
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
150
- const { node } = props, rest = __rest(props, ["node"]);
151
- return (0, jsx_runtime_1.jsx)(OrderedListMessage_1.default, Object.assign({}, rest));
152
- },
153
- li: (props) => {
154
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
155
- const { node } = props, rest = __rest(props, ["node"]);
156
- return (0, jsx_runtime_1.jsx)(ListItemMessage_1.default, Object.assign({}, rest));
157
- },
158
- // table requires node attribute for calculating headers for mobile breakpoint
159
- table: (props) => (0, jsx_runtime_1.jsx)(TableMessage_1.default, Object.assign({}, props, tableProps, { isPrimary: isPrimary })),
160
- tbody: (props) => {
161
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
162
- const { node } = props, rest = __rest(props, ["node"]);
163
- return (0, jsx_runtime_1.jsx)(TbodyMessage_1.default, Object.assign({}, rest));
164
- },
165
- thead: (props) => {
166
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
167
- const { node } = props, rest = __rest(props, ["node"]);
168
- return (0, jsx_runtime_1.jsx)(TheadMessage_1.default, Object.assign({}, rest));
169
- },
170
- tr: (props) => {
171
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
172
- const { node } = props, rest = __rest(props, ["node"]);
173
- return (0, jsx_runtime_1.jsx)(TrMessage_1.default, Object.assign({}, rest));
174
- },
175
- td: (props) => {
176
- // Conflicts with Td type
177
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
178
- const { node, width } = props, rest = __rest(props, ["node", "width"]);
179
- return (0, jsx_runtime_1.jsx)(TdMessage_1.default, Object.assign({}, rest));
180
- },
181
- th: (props) => {
182
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
183
- const { node } = props, rest = __rest(props, ["node"]);
184
- return (0, jsx_runtime_1.jsx)(ThMessage_1.default, Object.assign({}, rest));
185
- },
186
- img: (props) => {
187
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
188
- const { node } = props, rest = __rest(props, ["node"]);
189
- return (0, jsx_runtime_1.jsx)(ImageMessage_1.default, Object.assign({}, rest));
190
- },
191
- a: (props) => {
192
- // node is just the details of the document structure - not needed
193
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
194
- const { node } = props, rest = __rest(props, ["node"]);
195
- return (
196
- // some a types conflict with ButtonProps, but it's ok because we are using an a tag
197
- // there are too many to handle manually
198
- (0, jsx_runtime_1.jsx)(LinkMessage_1.default, Object.assign({}, rest, linkProps, { children: props.children })));
199
- },
200
- // used for footnotes
201
- sup: (props) => {
202
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
203
- const { node } = props, rest = __rest(props, ["node"]);
204
- return (0, jsx_runtime_1.jsx)(SuperscriptMessage_1.default, Object.assign({}, rest));
205
- }
206
- }, remarkPlugins: [[remark_gfm_1.default, Object.assign({}, remarkGfmProps)], ...additionalRemarkPlugins], rehypePlugins: rehypePlugins }, reactMarkdownProps, { remarkRehypeOptions: Object.assign({
207
- // removes sr-only class from footnote labels applied by default
208
- footnoteLabelProperties: { className: [''] } }, reactMarkdownProps === null || reactMarkdownProps === void 0 ? void 0 : reactMarkdownProps.remarkRehypeOptions), disallowedElements: disallowedElements, children: messageText })));
209
- };
56
+ const handleMarkdown = () => ((0, jsx_runtime_1.jsx)(MarkdownContent_1.default, { content: messageText, isMarkdownDisabled: isMarkdownDisabled, codeBlockProps: codeBlockProps, tableProps: tableProps, openLinkInNewTab: openLinkInNewTab, additionalRehypePlugins: additionalRehypePlugins, additionalRemarkPlugins: additionalRemarkPlugins, linkProps: linkProps, reactMarkdownProps: reactMarkdownProps, remarkGfmProps: remarkGfmProps, hasNoImages: role === 'user' && hasNoImagesInUserMessages, isPrimary: isPrimary }));
210
57
  const renderMessage = () => {
211
58
  if (isLoading) {
212
59
  return (0, jsx_runtime_1.jsx)(MessageLoading_1.default, { loadingWord: loadingWord, isPrimary: isPrimary });
@@ -219,10 +66,10 @@ const MessageBase = (_a) => {
219
66
  }
220
67
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [beforeMainContent && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: beforeMainContent }), error ? (0, jsx_runtime_1.jsx)(ErrorMessage_1.default, Object.assign({}, error)) : handleMarkdown()] }));
221
68
  };
222
- return ((0, jsx_runtime_1.jsxs)("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}`, "aria-live": isLiveRegion ? 'polite' : undefined, "aria-atomic": isLiveRegion ? false : undefined, ref: innerRef }, props, { children: [(0, jsx_runtime_1.jsx)(react_core_1.Avatar, Object.assign({ className: `pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`, src: avatar, alt: "" }, avatarProps)), (0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-contents", children: [(0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-meta", children: [name && ((0, jsx_runtime_1.jsx)("span", { className: "pf-chatbot__message-name", children: (0, jsx_runtime_1.jsx)(react_core_1.Truncate, { content: name }) })), role === 'bot' && ((0, jsx_runtime_1.jsx)(react_core_1.Label, { variant: "outline", isCompact: true, children: botWord })), (0, jsx_runtime_1.jsx)(react_core_1.Timestamp, { date: date, children: timestamp })] }), (0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-response", children: [(0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-and-actions", children: [renderMessage(), afterMainContent && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: afterMainContent }), toolResponse && (0, jsx_runtime_1.jsx)(ToolResponse_1.default, Object.assign({}, toolResponse)), deepThinking && (0, jsx_runtime_1.jsx)(DeepThinking_1.default, Object.assign({}, deepThinking)), toolCall && (0, jsx_runtime_1.jsx)(ToolCall_1.default, Object.assign({}, toolCall)), !isLoading && sources && (0, jsx_runtime_1.jsx)(SourcesCard_1.default, Object.assign({}, sources, { isCompact: isCompact })), quickStarts && quickStarts.quickStart && ((0, jsx_runtime_1.jsx)(QuickStartTile_1.default, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel, isCompact: isCompact })), !isLoading && !isEditable && actions && (0, jsx_runtime_1.jsx)(ResponseActions_1.default, { actions: actions }), userFeedbackForm && (0, jsx_runtime_1.jsx)(UserFeedback_1.default, Object.assign({}, userFeedbackForm, { timestamp: dateString, isCompact: isCompact })), userFeedbackComplete && ((0, jsx_runtime_1.jsx)(UserFeedbackComplete_1.default, Object.assign({}, userFeedbackComplete, { timestamp: dateString, isCompact: isCompact }))), !isLoading && quickResponses && ((0, jsx_runtime_1.jsx)(QuickResponse_1.default, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps, isCompact: isCompact }))] }), attachments && ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__message-attachments-container", children: attachments.map((attachment) => {
223
- var _a;
224
- return ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__message-attachment", children: (0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, { fileName: attachment.name, fileId: attachment.id, onClose: attachment.onClose, onClick: attachment.onClick, isLoading: attachment.isLoading, closeButtonAriaLabel: attachment.closeButtonAriaLabel, languageTestId: attachment.languageTestId, spinnerTestId: attachment.spinnerTestId, variant: isPrimary ? 'outline' : undefined }) }, (_a = attachment.id) !== null && _a !== void 0 ? _a : attachment.name));
225
- }) })), !isLoading && endContent && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: endContent })] })] })] })));
69
+ return ((0, jsx_runtime_1.jsxs)("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}`, "aria-live": isLiveRegion ? 'polite' : undefined, "aria-atomic": isLiveRegion ? false : undefined, ref: innerRef }, props, { children: [avatar && ((0, jsx_runtime_1.jsx)(react_core_1.Avatar, Object.assign({ className: `pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`, src: avatar, alt: "" }, avatarProps))), (0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-contents", children: [(0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-meta", children: [name && ((0, jsx_runtime_1.jsx)("span", { className: "pf-chatbot__message-name", children: (0, jsx_runtime_1.jsx)(react_core_1.Truncate, { content: name }) })), role === 'bot' && ((0, jsx_runtime_1.jsx)(react_core_1.Label, { variant: "outline", isCompact: true, children: botWord })), (0, jsx_runtime_1.jsx)(react_core_1.Timestamp, { date: date, children: timestamp })] }), (0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__message-response", children: children ? ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-and-actions", children: [renderMessage(), afterMainContent && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: afterMainContent }), toolResponse && (0, jsx_runtime_1.jsx)(ToolResponse_1.default, Object.assign({}, toolResponse)), deepThinking && (0, jsx_runtime_1.jsx)(DeepThinking_1.default, Object.assign({}, deepThinking)), toolCall && (0, jsx_runtime_1.jsx)(ToolCall_1.default, Object.assign({}, toolCall)), !isLoading && sources && (0, jsx_runtime_1.jsx)(SourcesCard_1.default, Object.assign({}, sources, { isCompact: isCompact })), quickStarts && quickStarts.quickStart && ((0, jsx_runtime_1.jsx)(QuickStartTile_1.default, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel, isCompact: isCompact })), !isLoading && !isEditable && actions && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: Array.isArray(actions) ? ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__response-actions-groups", children: actions.map((actionGroup, index) => ((0, jsx_runtime_1.jsx)(ResponseActions_1.default, { actions: actionGroup.actions || actionGroup, persistActionSelection: persistActionSelection || actionGroup.persistActionSelection }, index))) })) : ((0, jsx_runtime_1.jsx)(ResponseActions_1.default, { actions: actions, persistActionSelection: persistActionSelection })) })), userFeedbackForm && ((0, jsx_runtime_1.jsx)(UserFeedback_1.default, Object.assign({}, userFeedbackForm, { timestamp: dateString, isCompact: isCompact }))), userFeedbackComplete && ((0, jsx_runtime_1.jsx)(UserFeedbackComplete_1.default, Object.assign({}, userFeedbackComplete, { timestamp: dateString, isCompact: isCompact }))), !isLoading && quickResponses && ((0, jsx_runtime_1.jsx)(QuickResponse_1.default, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps, isCompact: isCompact }))] }), attachments && ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__message-attachments-container", children: attachments.map((attachment) => {
70
+ var _a;
71
+ return ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__message-attachment", children: (0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, { fileName: attachment.name, fileId: attachment.id, onClose: attachment.onClose, onClick: attachment.onClick, isLoading: attachment.isLoading, closeButtonAriaLabel: attachment.closeButtonAriaLabel, languageTestId: attachment.languageTestId, spinnerTestId: attachment.spinnerTestId, variant: isPrimary ? 'outline' : undefined }) }, (_a = attachment.id) !== null && _a !== void 0 ? _a : attachment.name));
72
+ }) })), !isLoading && endContent && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: endContent })] })) })] })] })));
226
73
  };
227
74
  exports.MessageBase = MessageBase;
228
75
  const Message = (0, react_1.forwardRef)((props, ref) => ((0, jsx_runtime_1.jsx)(exports.MessageBase, Object.assign({ innerRef: ref }, props))));
@@ -209,6 +209,10 @@ describe('Message', () => {
209
209
  (0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./testImg", role: "bot", name: "Bot", content: "Hi" }));
210
210
  expect(react_2.screen.getByRole('img')).toHaveAttribute('src', './testImg');
211
211
  });
212
+ it('should not render avatar if no avatar prop is passed', () => {
213
+ (0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { role: "bot", name: "Bot", content: "Hi" }));
214
+ expect(react_2.screen.queryByRole('img')).not.toBeInTheDocument();
215
+ });
212
216
  it('should render botWord correctly', () => {
213
217
  (0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", botWord: "\u4EBA\u5DE5\u77E5\u80FD" }));
214
218
  expect(react_2.screen.getByText('Bot')).toBeTruthy();
@@ -356,7 +360,7 @@ describe('Message', () => {
356
360
  expect(react_2.screen.queryByRole('button', { name: /No/i })).toBeFalsy();
357
361
  expect(react_2.screen.getByRole('button', { name: /1 more/i }));
358
362
  }));
359
- it('should be able to show actions', () => __awaiter(void 0, void 0, void 0, function* () {
363
+ it('Renders response actions when a single actions object is passed', () => __awaiter(void 0, void 0, void 0, function* () {
360
364
  (0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", actions: {
361
365
  // eslint-disable-next-line no-console
362
366
  positive: { onClick: () => console.log('Good response') },
@@ -374,9 +378,132 @@ describe('Message', () => {
374
378
  listen: { onClick: () => console.log('Listen') }
375
379
  } }));
376
380
  ALL_ACTIONS.forEach(({ label }) => {
377
- expect(react_2.screen.getByRole('button', { name: label })).toBeTruthy();
381
+ expect(react_2.screen.getByRole('button', { name: label })).toBeVisible();
382
+ });
383
+ }));
384
+ it('Renders response actions when an array of actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
385
+ (0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", actions: [
386
+ {
387
+ // eslint-disable-next-line no-console
388
+ positive: { onClick: () => console.log('Good response') },
389
+ // eslint-disable-next-line no-console
390
+ negative: { onClick: () => console.log('Bad response') }
391
+ },
392
+ {
393
+ // eslint-disable-next-line no-console
394
+ copy: { onClick: () => console.log('Copy') },
395
+ // eslint-disable-next-line no-console
396
+ edit: { onClick: () => console.log('Edit') },
397
+ // eslint-disable-next-line no-console
398
+ share: { onClick: () => console.log('Share') },
399
+ // eslint-disable-next-line no-console
400
+ download: { onClick: () => console.log('Download') }
401
+ },
402
+ {
403
+ // eslint-disable-next-line no-console
404
+ listen: { onClick: () => console.log('Listen') }
405
+ }
406
+ ] }));
407
+ ALL_ACTIONS.forEach(({ label }) => {
408
+ expect(react_2.screen.getByRole('button', { name: label })).toBeVisible();
409
+ });
410
+ }));
411
+ it('Renders response actions when an array of objects containing actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
412
+ (0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", actions: [
413
+ {
414
+ actions: {
415
+ // eslint-disable-next-line no-console
416
+ positive: { onClick: () => console.log('Good response') },
417
+ // eslint-disable-next-line no-console
418
+ negative: { onClick: () => console.log('Bad response') }
419
+ }
420
+ },
421
+ {
422
+ actions: {
423
+ // eslint-disable-next-line no-console
424
+ copy: { onClick: () => console.log('Copy') },
425
+ // eslint-disable-next-line no-console
426
+ edit: { onClick: () => console.log('Edit') },
427
+ // eslint-disable-next-line no-console
428
+ share: { onClick: () => console.log('Share') },
429
+ // eslint-disable-next-line no-console
430
+ download: { onClick: () => console.log('Download') }
431
+ }
432
+ },
433
+ {
434
+ actions: {
435
+ // eslint-disable-next-line no-console
436
+ listen: { onClick: () => console.log('Listen') }
437
+ }
438
+ }
439
+ ] }));
440
+ ALL_ACTIONS.forEach(({ label }) => {
441
+ expect(react_2.screen.getByRole('button', { name: label })).toBeVisible();
378
442
  });
379
443
  }));
444
+ it('should handle persistActionSelection correctly when a single actions object is passed', () => __awaiter(void 0, void 0, void 0, function* () {
445
+ (0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Test message", persistActionSelection: true, actions: {
446
+ positive: { onClick: jest.fn() },
447
+ negative: { onClick: jest.fn() }
448
+ } }));
449
+ const goodBtn = react_2.screen.getByRole('button', { name: /Good response/i });
450
+ const badBtn = react_2.screen.getByRole('button', { name: /Bad response/i });
451
+ yield user_event_1.default.click(goodBtn);
452
+ expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
453
+ yield user_event_1.default.click(react_2.screen.getByText('Test message'));
454
+ expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
455
+ yield user_event_1.default.click(badBtn);
456
+ expect(react_2.screen.getByRole('button', { name: /Bad response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
457
+ expect(goodBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
458
+ }));
459
+ it('should handle persistActionSelection correctly when an array of actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
460
+ (0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Test message", persistActionSelection: true, actions: [
461
+ {
462
+ positive: { onClick: jest.fn() },
463
+ negative: { onClick: jest.fn() }
464
+ },
465
+ {
466
+ copy: { onClick: jest.fn() }
467
+ }
468
+ ] }));
469
+ const goodBtn = react_2.screen.getByRole('button', { name: /Good response/i });
470
+ const copyBtn = react_2.screen.getByRole('button', { name: /Copy/i });
471
+ yield user_event_1.default.click(goodBtn);
472
+ expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
473
+ yield user_event_1.default.click(react_2.screen.getByText('Test message'));
474
+ expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
475
+ yield user_event_1.default.click(copyBtn);
476
+ expect(react_2.screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
477
+ yield user_event_1.default.click(react_2.screen.getByText('Test message'));
478
+ expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
479
+ expect(react_2.screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
480
+ }));
481
+ it('should handle persistActionSelection correctly when an array of objects containing actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
482
+ (0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Test message", actions: [
483
+ {
484
+ actions: {
485
+ positive: { onClick: jest.fn() },
486
+ negative: { onClick: jest.fn() }
487
+ },
488
+ persistActionSelection: true
489
+ },
490
+ {
491
+ actions: {
492
+ copy: { onClick: jest.fn() }
493
+ },
494
+ persistActionSelection: false
495
+ }
496
+ ] }));
497
+ const goodBtn = react_2.screen.getByRole('button', { name: /Good response/i });
498
+ const copyBtn = react_2.screen.getByRole('button', { name: /Copy/i });
499
+ yield user_event_1.default.click(goodBtn);
500
+ expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
501
+ yield user_event_1.default.click(copyBtn);
502
+ expect(react_2.screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
503
+ yield user_event_1.default.click(react_2.screen.getByText('Test message'));
504
+ expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
505
+ expect(copyBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
506
+ }));
380
507
  it('should not show actions if loading', () => __awaiter(void 0, void 0, void 0, function* () {
381
508
  (0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", isLoading: true, actions: {
382
509
  // eslint-disable-next-line no-console
@@ -0,0 +1,14 @@
1
+ import { FunctionComponent, HTMLProps, ReactNode } from 'react';
2
+ /**
3
+ * The container that wraps the primary message content and inline actions, such as ToolCall, ToolResponse, DeepThinking, ResponseActions, etc.
4
+ * Attachments should not be rendered inside this container.
5
+ * Use this component when passing children to Message to customize its structure.
6
+ */
7
+ export interface MessageAndActionsProps extends HTMLProps<HTMLDivElement> {
8
+ /** Content to render inside the message and actions container. */
9
+ children: ReactNode;
10
+ /** Additional classes applied to the message and actions container. */
11
+ className?: string;
12
+ }
13
+ export declare const MessageAndActions: FunctionComponent<MessageAndActionsProps>;
14
+ export default MessageAndActions;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.MessageAndActions = void 0;
15
+ const jsx_runtime_1 = require("react/jsx-runtime");
16
+ const react_styles_1 = require("@patternfly/react-styles");
17
+ const MessageAndActions = (_a) => {
18
+ var { children, className } = _a, props = __rest(_a, ["children", "className"]);
19
+ return ((0, jsx_runtime_1.jsx)("div", Object.assign({ className: (0, react_styles_1.css)('pf-chatbot__message-and-actions', className) }, props, { children: children })));
20
+ };
21
+ exports.MessageAndActions = MessageAndActions;
22
+ exports.default = exports.MessageAndActions;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';