@patternfly/chatbot 2.2.0-prerelease.9 → 2.2.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 (460) hide show
  1. package/dist/cjs/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
  2. package/dist/cjs/AttachmentEdit/AttachmentEdit.test.js +52 -0
  3. package/dist/cjs/Chatbot/Chatbot.d.ts +2 -1
  4. package/dist/cjs/Chatbot/Chatbot.js +1 -0
  5. package/dist/cjs/Chatbot/Chatbot.test.d.ts +1 -0
  6. package/dist/cjs/Chatbot/Chatbot.test.js +28 -0
  7. package/dist/cjs/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
  8. package/dist/cjs/ChatbotAlert/ChatbotAlert.test.js +27 -0
  9. package/dist/cjs/ChatbotContent/ChatbotContent.test.d.ts +1 -0
  10. package/dist/cjs/ChatbotContent/ChatbotContent.test.js +18 -0
  11. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
  12. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
  13. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
  14. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +24 -12
  15. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
  16. package/dist/cjs/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
  17. package/dist/cjs/ChatbotConversationHistoryNav/EmptyState.js +29 -0
  18. package/dist/cjs/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
  19. package/dist/cjs/ChatbotConversationHistoryNav/LoadingState.js +45 -0
  20. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  21. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +18 -0
  22. package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  23. package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.js +87 -0
  24. package/dist/cjs/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
  25. package/dist/cjs/ChatbotFooter/ChatbotFootnote.js +1 -1
  26. package/dist/cjs/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  27. package/dist/cjs/ChatbotHeader/ChatbotHeader.test.js +18 -0
  28. package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  29. package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.js +18 -0
  30. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +3 -1
  31. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  32. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.js +20 -0
  33. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  34. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.js +18 -0
  35. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +3 -1
  36. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
  37. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +20 -0
  38. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
  39. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
  40. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +43 -0
  41. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +6 -4
  42. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
  43. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +41 -0
  44. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.d.ts +3 -1
  45. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.js +4 -2
  46. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
  47. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.js +55 -0
  48. package/dist/cjs/ChatbotToggle/ChatbotToggle.js +3 -1
  49. package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
  50. package/dist/cjs/Compare/Compare.d.ts +17 -0
  51. package/dist/cjs/Compare/Compare.js +50 -0
  52. package/dist/cjs/Compare/Compare.test.d.ts +1 -0
  53. package/dist/cjs/Compare/Compare.test.js +20 -0
  54. package/dist/cjs/Compare/index.d.ts +2 -0
  55. package/dist/cjs/Compare/index.js +23 -0
  56. package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +4 -0
  57. package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +26 -0
  58. package/dist/cjs/Message/ImageMessage/ImageMessage.d.ts +4 -0
  59. package/dist/cjs/Message/ImageMessage/ImageMessage.js +25 -0
  60. package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +4 -0
  61. package/dist/cjs/Message/LinkMessage/LinkMessage.js +30 -0
  62. package/dist/cjs/Message/Message.d.ts +35 -8
  63. package/dist/cjs/Message/Message.js +68 -18
  64. package/dist/cjs/Message/Message.test.js +239 -3
  65. package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +17 -0
  66. package/dist/cjs/Message/QuickResponse/QuickResponse.js +34 -0
  67. package/dist/cjs/Message/TableMessage/TableMessage.d.ts +20 -0
  68. package/dist/cjs/Message/TableMessage/TableMessage.js +67 -0
  69. package/dist/cjs/Message/TableMessage/TbodyMessage.d.ts +7 -0
  70. package/dist/cjs/Message/TableMessage/TbodyMessage.js +33 -0
  71. package/dist/cjs/Message/TableMessage/TdMessage.d.ts +5 -0
  72. package/dist/cjs/Message/TableMessage/TdMessage.js +26 -0
  73. package/dist/cjs/Message/TableMessage/ThMessage.d.ts +5 -0
  74. package/dist/cjs/Message/TableMessage/ThMessage.js +26 -0
  75. package/dist/cjs/Message/TableMessage/TheadMessage.d.ts +5 -0
  76. package/dist/cjs/Message/TableMessage/TheadMessage.js +26 -0
  77. package/dist/cjs/Message/TableMessage/TrMessage.d.ts +7 -0
  78. package/dist/cjs/Message/TableMessage/TrMessage.js +37 -0
  79. package/dist/cjs/Message/TextMessage/TextMessage.d.ts +2 -1
  80. package/dist/cjs/Message/TextMessage/TextMessage.js +2 -2
  81. package/dist/cjs/Message/UserFeedback/CloseButton.d.ts +10 -0
  82. package/dist/cjs/Message/UserFeedback/CloseButton.js +14 -0
  83. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +39 -0
  84. package/dist/cjs/Message/UserFeedback/UserFeedback.js +54 -0
  85. package/dist/cjs/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  86. package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +133 -0
  87. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  88. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +117 -0
  89. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  90. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +249 -0
  91. package/dist/cjs/MessageBar/AttachButton.js +4 -2
  92. package/dist/cjs/MessageBar/MessageBar.d.ts +11 -4
  93. package/dist/cjs/MessageBar/MessageBar.js +127 -46
  94. package/dist/cjs/MessageBar/MessageBar.test.js +12 -4
  95. package/dist/cjs/MessageBar/MicrophoneButton.d.ts +1 -1
  96. package/dist/cjs/MessageBar/SendButton.js +3 -1
  97. package/dist/cjs/MessageBar/StopButton.js +3 -1
  98. package/dist/cjs/MessageBox/MessageBox.test.d.ts +1 -0
  99. package/dist/cjs/MessageBox/MessageBox.test.js +22 -0
  100. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  101. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.js +28 -0
  102. package/dist/cjs/ResponseActions/ResponseActionButton.d.ts +4 -1
  103. package/dist/cjs/ResponseActions/ResponseActionButton.js +21 -6
  104. package/dist/cjs/ResponseActions/ResponseActions.d.ts +8 -2
  105. package/dist/cjs/ResponseActions/ResponseActions.js +7 -7
  106. package/dist/cjs/ResponseActions/ResponseActions.test.js +2 -2
  107. package/dist/cjs/Settings/SettingsForm.test.d.ts +1 -0
  108. package/dist/cjs/Settings/SettingsForm.test.js +26 -0
  109. package/dist/cjs/__mocks__/rehype-external-links.d.ts +2 -0
  110. package/dist/cjs/__mocks__/rehype-external-links.js +4 -0
  111. package/dist/cjs/__mocks__/rehype-sanitize.d.ts +2 -0
  112. package/dist/cjs/__mocks__/rehype-sanitize.js +4 -0
  113. package/dist/cjs/__mocks__/rehype-unwrap-images.d.ts +2 -0
  114. package/dist/cjs/__mocks__/rehype-unwrap-images.js +4 -0
  115. package/dist/cjs/index.d.ts +4 -0
  116. package/dist/cjs/index.js +7 -1
  117. package/dist/cjs/tracking/console_tracking_provider.d.ts +10 -0
  118. package/dist/cjs/tracking/console_tracking_provider.js +27 -0
  119. package/dist/cjs/tracking/index.d.ts +2 -0
  120. package/dist/cjs/tracking/index.js +23 -0
  121. package/dist/cjs/tracking/posthog_tracking_provider.d.ts +9 -0
  122. package/dist/cjs/tracking/posthog_tracking_provider.js +37 -0
  123. package/dist/cjs/tracking/segment_tracking_provider.d.ts +10 -0
  124. package/dist/cjs/tracking/segment_tracking_provider.js +50 -0
  125. package/dist/cjs/tracking/trackingProviderProxy.d.ts +9 -0
  126. package/dist/cjs/tracking/trackingProviderProxy.js +24 -0
  127. package/dist/cjs/tracking/tracking_api.d.ts +8 -0
  128. package/dist/cjs/tracking/tracking_api.js +2 -0
  129. package/dist/cjs/tracking/tracking_registry.d.ts +4 -0
  130. package/dist/cjs/tracking/tracking_registry.js +33 -0
  131. package/dist/cjs/tracking/tracking_spi.d.ts +9 -0
  132. package/dist/cjs/tracking/tracking_spi.js +2 -0
  133. package/dist/cjs/tracking/umami_tracking_provider.d.ts +14 -0
  134. package/dist/cjs/tracking/umami_tracking_provider.js +44 -0
  135. package/dist/css/main.css +420 -148
  136. package/dist/css/main.css.map +1 -1
  137. package/dist/dynamic/Compare/package.json +1 -0
  138. package/dist/dynamic/tracking/package.json +1 -0
  139. package/dist/esm/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
  140. package/dist/esm/AttachmentEdit/AttachmentEdit.test.js +47 -0
  141. package/dist/esm/Chatbot/Chatbot.d.ts +2 -1
  142. package/dist/esm/Chatbot/Chatbot.js +1 -0
  143. package/dist/esm/Chatbot/Chatbot.test.d.ts +1 -0
  144. package/dist/esm/Chatbot/Chatbot.test.js +23 -0
  145. package/dist/esm/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
  146. package/dist/esm/ChatbotAlert/ChatbotAlert.test.js +22 -0
  147. package/dist/esm/ChatbotContent/ChatbotContent.test.d.ts +1 -0
  148. package/dist/esm/ChatbotContent/ChatbotContent.test.js +13 -0
  149. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
  150. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
  151. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
  152. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +24 -12
  153. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
  154. package/dist/esm/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
  155. package/dist/esm/ChatbotConversationHistoryNav/EmptyState.js +22 -0
  156. package/dist/esm/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
  157. package/dist/esm/ChatbotConversationHistoryNav/LoadingState.js +38 -0
  158. package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  159. package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +13 -0
  160. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  161. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.js +82 -0
  162. package/dist/esm/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
  163. package/dist/esm/ChatbotFooter/ChatbotFootnote.js +1 -1
  164. package/dist/esm/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  165. package/dist/esm/ChatbotHeader/ChatbotHeader.test.js +13 -0
  166. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  167. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.js +13 -0
  168. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +3 -1
  169. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  170. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +15 -0
  171. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  172. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.js +13 -0
  173. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +3 -1
  174. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
  175. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +15 -0
  176. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
  177. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
  178. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +38 -0
  179. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +6 -4
  180. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
  181. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +36 -0
  182. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.d.ts +3 -1
  183. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.js +4 -2
  184. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
  185. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.js +50 -0
  186. package/dist/esm/ChatbotToggle/ChatbotToggle.js +3 -1
  187. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
  188. package/dist/esm/Compare/Compare.d.ts +17 -0
  189. package/dist/esm/Compare/Compare.js +43 -0
  190. package/dist/esm/Compare/Compare.test.d.ts +1 -0
  191. package/dist/esm/Compare/Compare.test.js +15 -0
  192. package/dist/esm/Compare/index.d.ts +2 -0
  193. package/dist/esm/Compare/index.js +2 -0
  194. package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +4 -0
  195. package/dist/esm/Message/ErrorMessage/ErrorMessage.js +21 -0
  196. package/dist/esm/Message/ImageMessage/ImageMessage.d.ts +4 -0
  197. package/dist/esm/Message/ImageMessage/ImageMessage.js +20 -0
  198. package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +4 -0
  199. package/dist/esm/Message/LinkMessage/LinkMessage.js +25 -0
  200. package/dist/esm/Message/Message.d.ts +35 -8
  201. package/dist/esm/Message/Message.js +66 -16
  202. package/dist/esm/Message/Message.test.js +239 -3
  203. package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +17 -0
  204. package/dist/esm/Message/QuickResponse/QuickResponse.js +27 -0
  205. package/dist/esm/Message/TableMessage/TableMessage.d.ts +20 -0
  206. package/dist/esm/Message/TableMessage/TableMessage.js +62 -0
  207. package/dist/esm/Message/TableMessage/TbodyMessage.d.ts +7 -0
  208. package/dist/esm/Message/TableMessage/TbodyMessage.js +28 -0
  209. package/dist/esm/Message/TableMessage/TdMessage.d.ts +5 -0
  210. package/dist/esm/Message/TableMessage/TdMessage.js +21 -0
  211. package/dist/esm/Message/TableMessage/ThMessage.d.ts +5 -0
  212. package/dist/esm/Message/TableMessage/ThMessage.js +21 -0
  213. package/dist/esm/Message/TableMessage/TheadMessage.d.ts +5 -0
  214. package/dist/esm/Message/TableMessage/TheadMessage.js +21 -0
  215. package/dist/esm/Message/TableMessage/TrMessage.d.ts +7 -0
  216. package/dist/esm/Message/TableMessage/TrMessage.js +32 -0
  217. package/dist/esm/Message/TextMessage/TextMessage.d.ts +2 -1
  218. package/dist/esm/Message/TextMessage/TextMessage.js +3 -3
  219. package/dist/esm/Message/UserFeedback/CloseButton.d.ts +10 -0
  220. package/dist/esm/Message/UserFeedback/CloseButton.js +9 -0
  221. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +39 -0
  222. package/dist/esm/Message/UserFeedback/UserFeedback.js +49 -0
  223. package/dist/esm/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  224. package/dist/esm/Message/UserFeedback/UserFeedback.test.js +128 -0
  225. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  226. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +112 -0
  227. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  228. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +244 -0
  229. package/dist/esm/MessageBar/AttachButton.js +4 -2
  230. package/dist/esm/MessageBar/MessageBar.d.ts +11 -4
  231. package/dist/esm/MessageBar/MessageBar.js +127 -46
  232. package/dist/esm/MessageBar/MessageBar.test.js +12 -4
  233. package/dist/esm/MessageBar/MicrophoneButton.d.ts +1 -1
  234. package/dist/esm/MessageBar/SendButton.js +3 -1
  235. package/dist/esm/MessageBar/StopButton.js +3 -1
  236. package/dist/esm/MessageBox/MessageBox.test.d.ts +1 -0
  237. package/dist/esm/MessageBox/MessageBox.test.js +17 -0
  238. package/dist/esm/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  239. package/dist/esm/PreviewAttachment/PreviewAttachment.test.js +23 -0
  240. package/dist/esm/ResponseActions/ResponseActionButton.d.ts +4 -1
  241. package/dist/esm/ResponseActions/ResponseActionButton.js +18 -3
  242. package/dist/esm/ResponseActions/ResponseActions.d.ts +8 -2
  243. package/dist/esm/ResponseActions/ResponseActions.js +7 -7
  244. package/dist/esm/ResponseActions/ResponseActions.test.js +2 -2
  245. package/dist/esm/Settings/SettingsForm.test.d.ts +1 -0
  246. package/dist/esm/Settings/SettingsForm.test.js +21 -0
  247. package/dist/esm/__mocks__/rehype-external-links.d.ts +2 -0
  248. package/dist/esm/__mocks__/rehype-external-links.js +2 -0
  249. package/dist/esm/__mocks__/rehype-sanitize.d.ts +2 -0
  250. package/dist/esm/__mocks__/rehype-sanitize.js +2 -0
  251. package/dist/esm/__mocks__/rehype-unwrap-images.d.ts +2 -0
  252. package/dist/esm/__mocks__/rehype-unwrap-images.js +2 -0
  253. package/dist/esm/index.d.ts +4 -0
  254. package/dist/esm/index.js +4 -0
  255. package/dist/esm/tracking/console_tracking_provider.d.ts +10 -0
  256. package/dist/esm/tracking/console_tracking_provider.js +23 -0
  257. package/dist/esm/tracking/index.d.ts +2 -0
  258. package/dist/esm/tracking/index.js +2 -0
  259. package/dist/esm/tracking/posthog_tracking_provider.d.ts +9 -0
  260. package/dist/esm/tracking/posthog_tracking_provider.js +33 -0
  261. package/dist/esm/tracking/segment_tracking_provider.d.ts +10 -0
  262. package/dist/esm/tracking/segment_tracking_provider.js +46 -0
  263. package/dist/esm/tracking/trackingProviderProxy.d.ts +9 -0
  264. package/dist/esm/tracking/trackingProviderProxy.js +22 -0
  265. package/dist/esm/tracking/tracking_api.d.ts +8 -0
  266. package/dist/esm/tracking/tracking_api.js +1 -0
  267. package/dist/esm/tracking/tracking_registry.d.ts +4 -0
  268. package/dist/esm/tracking/tracking_registry.js +26 -0
  269. package/dist/esm/tracking/tracking_spi.d.ts +9 -0
  270. package/dist/esm/tracking/tracking_spi.js +1 -0
  271. package/dist/esm/tracking/umami_tracking_provider.d.ts +14 -0
  272. package/dist/esm/tracking/umami_tracking_provider.js +40 -0
  273. package/dist/tsconfig.tsbuildinfo +1 -1
  274. package/package.json +8 -3
  275. package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +8 -2
  276. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +192 -15
  277. package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +219 -0
  278. package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentError.tsx +2 -2
  279. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +214 -12
  280. package/patternfly-docs/content/extensions/chatbot/examples/Messages/FileDropZone.tsx +2 -1
  281. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithAttachment.tsx +2 -2
  282. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomResponseActions.tsx +1 -1
  283. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +71 -0
  284. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedbackTimeout.tsx +27 -0
  285. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +1 -1
  286. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +2 -2
  287. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithResponseActions.tsx +1 -1
  288. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +1 -1
  289. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +49 -8
  290. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +244 -14
  291. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +54 -0
  292. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFooter.tsx +1 -1
  293. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFootnote.tsx +5 -5
  294. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderBasic.tsx +1 -1
  295. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +36 -3
  296. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerNavigation.tsx +67 -0
  297. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +94 -0
  298. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarAttach.tsx +1 -1
  299. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomeInteraction.tsx +1 -1
  300. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomePrompt.tsx +7 -7
  301. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +21 -6
  302. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +14 -0
  303. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +39 -1
  304. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +48 -35
  305. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +2 -2
  306. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +3 -3
  307. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotInDrawer.tsx +453 -0
  308. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +11 -11
  309. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +206 -0
  310. package/patternfly-docs/content/extensions/chatbot/examples/demos/Feedback.tsx +104 -0
  311. package/patternfly-docs/content/extensions/chatbot/img/ai-action-inpage.svg +85 -0
  312. package/patternfly-docs/content/extensions/chatbot/img/ai-action-message.svg +63 -0
  313. package/patternfly-docs/content/extensions/chatbot/img/analytics-example.svg +127 -0
  314. package/patternfly-docs/content/extensions/chatbot/img/attached-file.svg +24 -29
  315. package/patternfly-docs/content/extensions/chatbot/img/attachment-menu.svg +4 -4
  316. package/patternfly-docs/content/extensions/chatbot/img/attachment-unsent.svg +30 -58
  317. package/patternfly-docs/content/extensions/chatbot/img/chatbot-analytics.svg +51 -0
  318. package/patternfly-docs/content/extensions/chatbot/img/chatbot-elements.svg +11 -12
  319. package/patternfly-docs/content/extensions/chatbot/img/chatbot-quickstarts-tile.svg +58 -0
  320. package/patternfly-docs/content/extensions/chatbot/img/chatbot-settings.svg +83 -0
  321. package/patternfly-docs/content/extensions/chatbot/img/comparison.svg +45 -0
  322. package/patternfly-docs/content/extensions/chatbot/img/conversation-history.svg +6 -29
  323. package/patternfly-docs/content/extensions/chatbot/img/docked.svg +259 -241
  324. package/patternfly-docs/content/extensions/chatbot/img/drawer.svg +255 -0
  325. package/patternfly-docs/content/extensions/chatbot/img/error-state.svg +30 -0
  326. package/patternfly-docs/content/extensions/chatbot/img/feedback-form.svg +88 -0
  327. package/patternfly-docs/content/extensions/chatbot/img/footnote.svg +1 -1
  328. package/patternfly-docs/content/extensions/chatbot/img/fullscreen.svg +25 -16
  329. package/patternfly-docs/content/extensions/chatbot/img/listening-pulse.svg +22 -0
  330. package/patternfly-docs/content/extensions/chatbot/img/listening.svg +1 -1
  331. package/patternfly-docs/content/extensions/chatbot/img/loading-state.svg +28 -0
  332. package/patternfly-docs/content/extensions/chatbot/img/masthead-toggle-notification.svg +49 -0
  333. package/patternfly-docs/content/extensions/chatbot/img/masthead-toggle.svg +75 -0
  334. package/patternfly-docs/content/extensions/chatbot/img/message-bar-elements.svg +3 -3
  335. package/patternfly-docs/content/extensions/chatbot/img/message-elements.svg +84 -142
  336. package/patternfly-docs/content/extensions/chatbot/img/message-feedback.svg +52 -0
  337. package/patternfly-docs/content/extensions/chatbot/img/message-responses.svg +54 -0
  338. package/patternfly-docs/content/extensions/chatbot/img/new-chat-emptystate.svg +27 -0
  339. package/patternfly-docs/content/extensions/chatbot/img/no-results-emptystate.svg +27 -0
  340. package/patternfly-docs/content/extensions/chatbot/img/overlay.svg +54 -39
  341. package/patternfly-docs/content/extensions/chatbot/img/posthog.svg +30 -0
  342. package/patternfly-docs/content/extensions/chatbot/img/segment.svg +36 -0
  343. package/patternfly-docs/content/extensions/chatbot/img/settings-menu.svg +122 -0
  344. package/patternfly-docs/content/extensions/chatbot/img/source-tile.svg +62 -0
  345. package/patternfly-docs/content/extensions/chatbot/img/thank-you-card.svg +81 -0
  346. package/patternfly-docs/content/extensions/chatbot/img/toggle-customizations.svg +12 -0
  347. package/patternfly-docs/content/extensions/chatbot/img/toggle-tooltips.svg +38 -0
  348. package/patternfly-docs/content/extensions/chatbot/img/umami.svg +30 -0
  349. package/patternfly-docs/content/extensions/chatbot/img/welcome-elements.svg +82 -0
  350. package/patternfly-docs/content/extensions/chatbot/img/welcome-message.svg +94 -0
  351. package/src/AttachMenu/AttachMenu.scss +1 -1
  352. package/src/AttachmentEdit/AttachmentEdit.test.tsx +55 -0
  353. package/src/Chatbot/Chatbot.scss +20 -1
  354. package/src/Chatbot/Chatbot.test.tsx +31 -0
  355. package/src/Chatbot/Chatbot.tsx +2 -1
  356. package/src/ChatbotAlert/ChatbotAlert.test.tsx +31 -0
  357. package/src/ChatbotContent/ChatbotContent.scss +1 -0
  358. package/src/ChatbotContent/ChatbotContent.test.tsx +15 -0
  359. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx +10 -4
  360. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +24 -1
  361. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +242 -3
  362. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +94 -26
  363. package/src/ChatbotConversationHistoryNav/EmptyState.tsx +44 -0
  364. package/src/ChatbotConversationHistoryNav/LoadingState.tsx +38 -0
  365. package/src/ChatbotFooter/ChatbotFooter.scss +8 -4
  366. package/src/ChatbotFooter/ChatbotFooter.test.tsx +15 -0
  367. package/src/ChatbotFooter/ChatbotFooternote.test.tsx +84 -0
  368. package/src/ChatbotFooter/ChatbotFootnote.tsx +2 -2
  369. package/src/ChatbotHeader/ChatbotHeader.scss +5 -6
  370. package/src/ChatbotHeader/ChatbotHeader.test.tsx +15 -0
  371. package/src/ChatbotHeader/ChatbotHeaderActions.test.tsx +17 -0
  372. package/src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx +20 -0
  373. package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +7 -1
  374. package/src/ChatbotHeader/ChatbotHeaderMain.test.tsx +17 -0
  375. package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +19 -0
  376. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +7 -1
  377. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx +45 -0
  378. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx +8 -1
  379. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx +43 -0
  380. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx +11 -4
  381. package/src/ChatbotHeader/ChatbotHeaderTitle.test.tsx +75 -0
  382. package/src/ChatbotHeader/ChatbotHeaderTitle.tsx +7 -2
  383. package/src/ChatbotModal/ChatbotModal.scss +12 -12
  384. package/src/ChatbotToggle/ChatbotToggle.tsx +6 -1
  385. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.scss +2 -0
  386. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx +26 -18
  387. package/src/ChatbotWelcomePrompt/__snapshots__/ChatbotWelcomePrompt.test.tsx.snap +2 -2
  388. package/src/CodeModal/CodeModal.scss +7 -4
  389. package/src/Compare/Compare.scss +72 -0
  390. package/src/Compare/Compare.test.tsx +31 -0
  391. package/src/Compare/Compare.tsx +98 -0
  392. package/src/Compare/index.ts +2 -0
  393. package/src/FileDetails/FileDetails.scss +1 -1
  394. package/src/FileDetailsLabel/FileDetailsLabel.scss +2 -2
  395. package/src/FileDropZone/__snapshots__/FileDropZone.test.tsx.snap +1 -0
  396. package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +4 -4
  397. package/src/Message/ErrorMessage/ErrorMessage.tsx +14 -0
  398. package/src/Message/ImageMessage/ImageMessage.scss +9 -0
  399. package/src/Message/ImageMessage/ImageMessage.tsx +14 -0
  400. package/src/Message/LinkMessage/LinkMessage.tsx +34 -0
  401. package/src/Message/ListMessage/ListMessage.scss +6 -6
  402. package/src/Message/Message.scss +4 -26
  403. package/src/Message/Message.test.tsx +313 -3
  404. package/src/Message/Message.tsx +130 -31
  405. package/src/Message/MessageLoading.scss +2 -2
  406. package/src/Message/QuickResponse/QuickResponse.scss +33 -0
  407. package/src/Message/QuickResponse/QuickResponse.tsx +54 -0
  408. package/src/Message/QuickStarts/QuickStartTile.scss +0 -1
  409. package/src/Message/TableMessage/TableMessage.scss +23 -0
  410. package/src/Message/TableMessage/TableMessage.tsx +83 -0
  411. package/src/Message/TableMessage/TbodyMessage.tsx +20 -0
  412. package/src/Message/TableMessage/TdMessage.tsx +11 -0
  413. package/src/Message/TableMessage/ThMessage.tsx +11 -0
  414. package/src/Message/TableMessage/TheadMessage.tsx +11 -0
  415. package/src/Message/TableMessage/TrMessage.tsx +27 -0
  416. package/src/Message/TextMessage/TextMessage.scss +21 -12
  417. package/src/Message/TextMessage/TextMessage.tsx +3 -3
  418. package/src/Message/UserFeedback/CloseButton.tsx +21 -0
  419. package/src/Message/UserFeedback/UserFeedback.scss +53 -0
  420. package/src/Message/UserFeedback/UserFeedback.test.tsx +236 -0
  421. package/src/Message/UserFeedback/UserFeedback.tsx +128 -0
  422. package/src/Message/UserFeedback/UserFeedbackComplete.test.tsx +255 -0
  423. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +211 -0
  424. package/src/MessageBar/AttachButton.scss +19 -3
  425. package/src/MessageBar/AttachButton.tsx +3 -1
  426. package/src/MessageBar/MessageBar.scss +58 -24
  427. package/src/MessageBar/MessageBar.test.tsx +12 -4
  428. package/src/MessageBar/MessageBar.tsx +164 -65
  429. package/src/MessageBar/MicrophoneButton.scss +8 -8
  430. package/src/MessageBar/MicrophoneButton.tsx +1 -1
  431. package/src/MessageBar/SendButton.tsx +2 -0
  432. package/src/MessageBar/StopButton.scss +17 -3
  433. package/src/MessageBar/StopButton.tsx +2 -0
  434. package/src/MessageBox/JumpButton.scss +6 -6
  435. package/src/MessageBox/MessageBox.scss +1 -0
  436. package/src/MessageBox/MessageBox.test.tsx +26 -0
  437. package/src/PreviewAttachment/PreviewAttachment.test.tsx +51 -0
  438. package/src/ResponseActions/ResponseActionButton.tsx +14 -2
  439. package/src/ResponseActions/ResponseActions.scss +2 -2
  440. package/src/ResponseActions/ResponseActions.test.tsx +4 -2
  441. package/src/ResponseActions/ResponseActions.tsx +26 -2
  442. package/src/Settings/Settings.scss +2 -2
  443. package/src/Settings/SettingsForm.test.tsx +28 -0
  444. package/src/SourceDetailsMenuItem/SourceDetailsMenuItem.scss +2 -2
  445. package/src/SourcesCard/SourcesCard.scss +9 -3
  446. package/src/TermsOfUse/TermsOfUse.scss +1 -1
  447. package/src/__mocks__/rehype-external-links.ts +3 -0
  448. package/src/__mocks__/rehype-sanitize.ts +3 -0
  449. package/src/__mocks__/rehype-unwrap-images.tsx +3 -0
  450. package/src/index.ts +6 -0
  451. package/src/main.scss +5 -6
  452. package/src/tracking/console_tracking_provider.ts +30 -0
  453. package/src/tracking/index.ts +3 -0
  454. package/src/tracking/posthog_tracking_provider.ts +42 -0
  455. package/src/tracking/segment_tracking_provider.ts +62 -0
  456. package/src/tracking/trackingProviderProxy.ts +28 -0
  457. package/src/tracking/tracking_api.ts +11 -0
  458. package/src/tracking/tracking_registry.ts +33 -0
  459. package/src/tracking/tracking_spi.ts +14 -0
  460. package/src/tracking/umami_tracking_provider.ts +54 -0
@@ -5,6 +5,8 @@ import Message from './Message';
5
5
  import userEvent from '@testing-library/user-event';
6
6
  import { monitorSampleAppQuickStart } from './QuickStarts/monitor-sampleapp-quickstart';
7
7
  import { monitorSampleAppQuickStartWithImage } from './QuickStarts/monitor-sampleapp-quickstart-with-image';
8
+ import rehypeExternalLinks from '../__mocks__/rehype-external-links';
9
+ import { AlertActionLink } from '@patternfly/react-core';
8
10
 
9
11
  const ALL_ACTIONS = [
10
12
  { label: /Good response/i },
@@ -71,6 +73,89 @@ const ORDERED_LIST_WITH_CODE = `
71
73
  3. Item 3
72
74
  `;
73
75
 
76
+ const HEADING = `
77
+ # h1 Heading
78
+
79
+ ## h2 Heading
80
+
81
+ ### h3 Heading
82
+
83
+ #### h4 Heading
84
+
85
+ ##### h5 Heading
86
+
87
+ ###### h6 Heading
88
+ `;
89
+
90
+ const BLOCK_QUOTES = `> Blockquotes can also be nested...
91
+ >> ...by using additional greater-than signs (>) right next to each other...
92
+ > > > ...or with spaces between each sign.`;
93
+ const TABLE = `
94
+
95
+ | Column 1 | Column 2 |
96
+ |-|-|
97
+ | Cell 1 | Cell 2 |
98
+ | Cell 3 | Cell 4 |
99
+
100
+ `;
101
+
102
+ const ONE_COLUMN_TABLE = `
103
+
104
+ | Column 1 |
105
+ |-|
106
+ | Cell 1 |
107
+ | Cell 2 |
108
+
109
+ `;
110
+
111
+ const ONE_CELL_TABLE = `
112
+
113
+ | Column 1 |
114
+ |-|
115
+ | Cell 1 |
116
+
117
+ `;
118
+
119
+ const HEADERLESS_TABLE = `
120
+
121
+ | |
122
+ |-|
123
+ | Cell 1 |
124
+
125
+ `;
126
+
127
+ const CHILDLESS_TABLE = `
128
+
129
+ | Column 1 |
130
+ |-|
131
+ | |
132
+
133
+ `;
134
+
135
+ const EMPTY_TABLE = `
136
+
137
+ | |
138
+ |-|
139
+ | |
140
+
141
+ `;
142
+
143
+ const IMAGE = `![Multi-colored wavy lines on a black background](https://cdn.dribbble.com/userupload/10651749/file/original-8a07b8e39d9e8bf002358c66fce1223e.gif)`;
144
+
145
+ const ERROR = {
146
+ title: 'Could not load chat',
147
+ children: 'Wait a few minutes and check your network settings. If the issue persists: ',
148
+ actionLinks: (
149
+ <React.Fragment>
150
+ <AlertActionLink component="a" href="#">
151
+ Start a new chat
152
+ </AlertActionLink>
153
+ <AlertActionLink component="a" href="#">
154
+ Contact support
155
+ </AlertActionLink>
156
+ </React.Fragment>
157
+ )
158
+ };
74
159
  const checkListItemsRendered = () => {
75
160
  const items = ['Item 1', 'Item 2', 'Item 3'];
76
161
  expect(screen.getAllByRole('listitem')).toHaveLength(3);
@@ -81,6 +166,9 @@ const checkListItemsRendered = () => {
81
166
  };
82
167
 
83
168
  describe('Message', () => {
169
+ beforeEach(() => {
170
+ jest.clearAllMocks();
171
+ });
84
172
  it('should render user messages correctly', () => {
85
173
  render(<Message avatar="./img" role="user" name="User" content="Hi" />);
86
174
  expect(screen.getByText('User')).toBeTruthy();
@@ -377,13 +465,17 @@ describe('Message', () => {
377
465
  render(<Message avatar="./img" role="user" name="User" content={CODE_MESSAGE} />);
378
466
  expect(screen.getByText('Here is some YAML code:')).toBeTruthy();
379
467
  expect(screen.getByRole('button', { name: 'Copy code button' })).toBeTruthy();
380
- expect(screen.getByText(/apiVersion: helm.openshift.io\/v1beta1/i)).toBeTruthy();
468
+ expect(screen.getByText(/yaml/)).toBeTruthy();
469
+ expect(screen.getByText(/apiVersion:/i)).toBeTruthy();
470
+ expect(screen.getByText(/helm.openshift.io\/v1beta1/i)).toBeTruthy();
381
471
  expect(screen.getByText(/metadata:/i)).toBeTruthy();
382
- expect(screen.getByText(/name: azure-sample-repo0oooo00ooo/i)).toBeTruthy();
472
+ expect(screen.getByText(/name:/i)).toBeTruthy();
473
+ expect(screen.getByText(/azure-sample-repo0oooo00ooo/i)).toBeTruthy();
383
474
  expect(screen.getByText(/spec/i)).toBeTruthy();
384
475
  expect(screen.getByText(/connectionConfig:/i)).toBeTruthy();
476
+ expect(screen.getByText(/url:/i)).toBeTruthy();
385
477
  expect(
386
- screen.getByText(/url: https:\/\/raw.githubusercontent.com\/Azure-Samples\/helm-charts\/master\/docs/i)
478
+ screen.getByText(/https:\/\/raw.githubusercontent.com\/Azure-Samples\/helm-charts\/master\/docs/i)
387
479
  ).toBeTruthy();
388
480
  });
389
481
  it('can click copy code button', async () => {
@@ -491,4 +583,222 @@ describe('Message', () => {
491
583
  );
492
584
  expect(screen.getAllByRole('img')[1]).toHaveAttribute('src', 'test.png');
493
585
  });
586
+ it('should handle block quote correctly', () => {
587
+ render(<Message avatar="./img" role="user" name="User" content={BLOCK_QUOTES} />);
588
+ expect(screen.getByText(/Blockquotes can also be nested.../)).toBeTruthy();
589
+ expect(screen.getByText('...by using additional greater-than signs (>) right next to each other...')).toBeTruthy();
590
+ expect(screen.getByText(/...or with spaces between each sign./)).toBeTruthy();
591
+ });
592
+ it('should handle heading correctly', () => {
593
+ render(<Message avatar="./img" role="user" name="User" content={HEADING} />);
594
+ expect(screen.getByRole('heading', { name: /h1 Heading/i })).toBeTruthy();
595
+ expect(screen.getByRole('heading', { name: /h2 Heading/i })).toBeTruthy();
596
+ expect(screen.getByRole('heading', { name: /h3 Heading/i })).toBeTruthy();
597
+ expect(screen.getByRole('heading', { name: /h4 Heading/i })).toBeTruthy();
598
+ expect(screen.getByRole('heading', { name: /h5 Heading/i })).toBeTruthy();
599
+ expect(screen.getByRole('heading', { name: /h6 Heading/i })).toBeTruthy();
600
+ });
601
+ it('should render table correctly', () => {
602
+ render(<Message avatar="./img" role="user" name="User" content={TABLE} />);
603
+ expect(screen.getByRole('row', { name: /Column 1 Column 2/i })).toBeTruthy();
604
+ expect(screen.getByRole('row', { name: /Cell 1 Cell 2/i })).toBeTruthy();
605
+ expect(screen.getByRole('row', { name: /Cell 3 Cell 4/i })).toBeTruthy();
606
+ expect(screen.getByRole('columnheader', { name: /Column 1/i })).toBeTruthy();
607
+ expect(screen.getByRole('columnheader', { name: /Column 2/i })).toBeTruthy();
608
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toBeTruthy();
609
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toBeTruthy();
610
+ expect(screen.getByRole('cell', { name: /Cell 3/i })).toBeTruthy();
611
+ expect(screen.getByRole('cell', { name: /Cell 4/i })).toBeTruthy();
612
+ });
613
+ it('should render table data labels correctly for mobile breakpoint', () => {
614
+ render(<Message avatar="./img" role="user" name="User" content={TABLE} />);
615
+ expect(screen.getByRole('row', { name: /Cell 1 Cell 2/i })).toHaveAttribute('extraHeaders', 'Column 1,Column 2');
616
+ expect(screen.getByRole('row', { name: /Cell 3 Cell 4/i })).toHaveAttribute('extraHeaders', 'Column 1,Column 2');
617
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
618
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toHaveAttribute('data-label', 'Column 2');
619
+ expect(screen.getByRole('cell', { name: /Cell 3/i })).toHaveAttribute('data-label', 'Column 1');
620
+ expect(screen.getByRole('cell', { name: /Cell 4/i })).toHaveAttribute('data-label', 'Column 2');
621
+ });
622
+ it('should render table data labels correctly for mobile breakpoint for one column table', () => {
623
+ render(<Message avatar="./img" role="user" name="User" content={ONE_COLUMN_TABLE} />);
624
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', 'Column 1');
625
+ expect(screen.getByRole('row', { name: /Cell 2/i })).toHaveAttribute('extraHeaders', 'Column 1');
626
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
627
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toHaveAttribute('data-label', 'Column 1');
628
+ });
629
+ it('should render table data labels correctly for mobile breakpoint for one cell table', () => {
630
+ render(<Message avatar="./img" role="user" name="User" content={ONE_CELL_TABLE} />);
631
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', 'Column 1');
632
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
633
+ });
634
+ it('should render table data labels correctly for mobile breakpoint for headerless', () => {
635
+ render(<Message avatar="./img" role="user" name="User" content={HEADERLESS_TABLE} />);
636
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', '');
637
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).not.toHaveAttribute('data-label');
638
+ });
639
+ it('should render table data labels correctly for mobile breakpoint for childless', () => {
640
+ render(<Message avatar="./img" role="user" name="User" content={CHILDLESS_TABLE} />);
641
+ expect(screen.getByRole('cell')).not.toHaveAttribute('extraHeaders', 'Column 1');
642
+ });
643
+ it('should render table data labels correctly for mobile breakpoint for empty', () => {
644
+ render(<Message avatar="./img" role="user" name="User" content={EMPTY_TABLE} />);
645
+ expect(screen.getByRole('cell')).not.toHaveAttribute('extraHeaders', '');
646
+ });
647
+ it('should render custom table aria label correctly', () => {
648
+ render(<Message avatar="./img" role="user" name="User" content={TABLE} tableProps={{ 'aria-label': 'Test' }} />);
649
+ expect(screen.getByRole('grid', { name: /Test/i })).toBeTruthy();
650
+ });
651
+ it('should render beforeMainContent with main content', () => {
652
+ const mainContent = 'Main message content';
653
+ const beforeMainContentText = 'Before main content';
654
+ const beforeMainContent = <div>{beforeMainContentText}</div>;
655
+
656
+ render(
657
+ <Message avatar="./img" role="user" name="User" content={mainContent} extraContent={{ beforeMainContent }} />
658
+ );
659
+
660
+ expect(screen.getByText(beforeMainContentText)).toBeTruthy();
661
+ expect(screen.getByText(mainContent)).toBeTruthy();
662
+ });
663
+ it('should render afterMainContent with main content', () => {
664
+ const mainContent = 'Main message content';
665
+ const afterMainContentText = 'After main content';
666
+ const afterMainContent = <div>{afterMainContentText}</div>;
667
+
668
+ render(
669
+ <Message avatar="./img" role="user" name="User" content={mainContent} extraContent={{ afterMainContent }} />
670
+ );
671
+
672
+ expect(screen.getByText(afterMainContentText)).toBeTruthy();
673
+ expect(screen.getByText(mainContent)).toBeTruthy();
674
+ });
675
+
676
+ it('should render endContent with main content', () => {
677
+ const mainContent = 'Main message content';
678
+ const endMainContentText = 'End content';
679
+ const endContent = <div>{endMainContentText}</div>;
680
+
681
+ render(<Message avatar="./img" role="user" name="User" content={mainContent} extraContent={{ endContent }} />);
682
+
683
+ expect(screen.getByText(endMainContentText)).toBeTruthy();
684
+ expect(screen.getByText(mainContent)).toBeTruthy();
685
+ });
686
+ it('should render all parts of extraContent with main content', () => {
687
+ const beforeMainContent = <div>Before main content</div>;
688
+ const afterMainContent = <div>After main content</div>;
689
+ const endContent = <div>End content</div>;
690
+
691
+ render(
692
+ <Message
693
+ avatar="./img"
694
+ role="user"
695
+ name="User"
696
+ content="Main message content"
697
+ extraContent={{ beforeMainContent, afterMainContent, endContent }}
698
+ />
699
+ );
700
+
701
+ expect(screen.getByText('Before main content')).toBeTruthy();
702
+ expect(screen.getByText('Main message content')).toBeTruthy();
703
+ expect(screen.getByText('After main content')).toBeTruthy();
704
+ expect(screen.getByText('End content')).toBeTruthy();
705
+ });
706
+
707
+ it('should not render extraContent when not provided', () => {
708
+ render(<Message avatar="./img" role="user" name="User" content="Main message content" />);
709
+
710
+ // Ensure no extraContent is rendered
711
+ expect(screen.getByText('Main message content')).toBeTruthy();
712
+ expect(screen.queryByText('Before main content')).toBeFalsy();
713
+ expect(screen.queryByText('After main content')).toBeFalsy();
714
+ expect(screen.queryByText('end message content')).toBeFalsy();
715
+ });
716
+
717
+ it('should handle undefined or null values in extraContent gracefully', () => {
718
+ render(
719
+ <Message
720
+ avatar="./img"
721
+ role="user"
722
+ name="User"
723
+ content="Main message content"
724
+ extraContent={{ beforeMainContent: null, afterMainContent: undefined, endContent: null }}
725
+ />
726
+ );
727
+
728
+ // Ensure that no extraContent is rendered if they are null or undefined
729
+ expect(screen.getByText('Main message content')).toBeTruthy();
730
+ expect(screen.queryByText('Before main content')).toBeFalsy();
731
+ expect(screen.queryByText('After main content')).toBeFalsy();
732
+ expect(screen.queryByText('end message content')).toBeFalsy();
733
+ });
734
+ it('should render JSX in extraContent correctly', () => {
735
+ const beforeMainContent = (
736
+ <div data-testid="before-main-content">
737
+ <strong>Bold before content</strong>
738
+ </div>
739
+ );
740
+ const afterMainContent = (
741
+ <div data-testid="after-main-content">
742
+ <strong>Bold after content</strong>
743
+ </div>
744
+ );
745
+ const endContent = (
746
+ <div data-testid="end-main-content">
747
+ <strong>Bold end content</strong>
748
+ </div>
749
+ );
750
+ render(
751
+ <Message
752
+ avatar="./img"
753
+ role="user"
754
+ name="User"
755
+ content="Main message content"
756
+ extraContent={{ beforeMainContent, afterMainContent, endContent }}
757
+ />
758
+ );
759
+
760
+ // Check that the JSX is correctly rendered
761
+ expect(screen.getByTestId('before-main-content')).toContainHTML('<strong>Bold before content</strong>');
762
+ expect(screen.getByTestId('after-main-content')).toContainHTML('<strong>Bold after content</strong>');
763
+ expect(screen.getByTestId('end-main-content')).toContainHTML('<strong>Bold end content</strong>');
764
+ });
765
+ it('should handle image correctly', () => {
766
+ render(<Message avatar="./img" role="user" name="User" content={IMAGE} />);
767
+ expect(screen.getByRole('img', { name: /Multi-colored wavy lines on a black background/i })).toBeTruthy();
768
+ });
769
+ it('should handle external links correctly', () => {
770
+ render(<Message avatar="./img" role="user" name="User" content={`[PatternFly](https://www.patternfly.org/)`} />);
771
+ // we are mocking rehype libraries, so we can't test target _blank addition on links directly with RTL
772
+ expect(rehypeExternalLinks).toHaveBeenCalledTimes(1);
773
+ });
774
+ it('should handle external links correctly', () => {
775
+ render(
776
+ <Message
777
+ avatar="./img"
778
+ role="user"
779
+ name="User"
780
+ content={`[PatternFly](https://www.patternfly.org/)`}
781
+ openLinkInNewTab={false}
782
+ />
783
+ );
784
+ // we are mocking rehype libraries, so we can't test target _blank addition on links directly with RTL
785
+ expect(rehypeExternalLinks).not.toHaveBeenCalled();
786
+ });
787
+ it('should handle error correctly', () => {
788
+ render(<Message avatar="./img" role="user" name="User" error={ERROR} />);
789
+ expect(screen.getByRole('heading', { name: /Could not load chat/i })).toBeTruthy();
790
+ expect(screen.getByRole('link', { name: /Start a new chat/i })).toBeTruthy();
791
+ expect(screen.getByRole('link', { name: /Contact support/i })).toBeTruthy();
792
+ expect(screen.getByText('Wait a few minutes and check your network settings. If the issue persists:')).toBeTruthy();
793
+ });
794
+ it('should handle error correctly when loading', () => {
795
+ render(<Message avatar="./img" role="user" name="User" error={ERROR} isLoading />);
796
+ expect(screen.queryByRole('heading', { name: /Could not load chat/i })).toBeFalsy();
797
+ expect(screen.getByText('Loading message')).toBeTruthy();
798
+ });
799
+ it('should handle error correctly when these is content', () => {
800
+ render(<Message avatar="./img" role="user" name="User" error={ERROR} content="Test" />);
801
+ expect(screen.getByRole('heading', { name: /Could not load chat/i })).toBeTruthy();
802
+ expect(screen.queryByText('Test')).toBeFalsy();
803
+ });
494
804
  });
@@ -2,17 +2,17 @@
2
2
  // Chatbot Main - Message
3
3
  // ============================================================================
4
4
 
5
- import React from 'react';
5
+ import React, { ReactNode } from 'react';
6
6
 
7
7
  import Markdown from 'react-markdown';
8
8
  import remarkGfm from 'remark-gfm';
9
9
  import {
10
+ AlertProps,
10
11
  Avatar,
11
12
  AvatarProps,
13
+ ContentVariants,
12
14
  Label,
13
- LabelGroup,
14
15
  LabelGroupProps,
15
- LabelProps,
16
16
  Timestamp,
17
17
  Truncate
18
18
  } from '@patternfly/react-core';
@@ -27,12 +27,24 @@ import UnorderedListMessage from './ListMessage/UnorderedListMessage';
27
27
  import OrderedListMessage from './ListMessage/OrderedListMessage';
28
28
  import QuickStartTile from './QuickStarts/QuickStartTile';
29
29
  import { QuickStart, QuickstartAction } from './QuickStarts/types';
30
+ import QuickResponse from './QuickResponse/QuickResponse';
31
+ import UserFeedback, { UserFeedbackProps } from './UserFeedback/UserFeedback';
32
+ import UserFeedbackComplete, { UserFeedbackCompleteProps } from './UserFeedback/UserFeedbackComplete';
33
+ import TableMessage from './TableMessage/TableMessage';
34
+ import TrMessage from './TableMessage/TrMessage';
35
+ import TdMessage from './TableMessage/TdMessage';
36
+ import TbodyMessage from './TableMessage/TbodyMessage';
37
+ import TheadMessage from './TableMessage/TheadMessage';
38
+ import ThMessage from './TableMessage/ThMessage';
39
+ import { TableProps } from '@patternfly/react-table';
40
+ import ImageMessage from './ImageMessage/ImageMessage';
41
+ import rehypeUnwrapImages from 'rehype-unwrap-images';
42
+ import rehypeExternalLinks from 'rehype-external-links';
43
+ import rehypeSanitize from 'rehype-sanitize';
44
+ import { PluggableList } from 'react-markdown/lib';
45
+ import LinkMessage from './LinkMessage/LinkMessage';
46
+ import ErrorMessage from './ErrorMessage/ErrorMessage';
30
47
 
31
- export interface QuickResponse extends Omit<LabelProps, 'children'> {
32
- content: string;
33
- id: string;
34
- onClick: () => void;
35
- }
36
48
  export interface MessageAttachment {
37
49
  /** Name of file attached to the message */
38
50
  name: string;
@@ -52,6 +64,17 @@ export interface MessageAttachment {
52
64
  spinnerTestId?: string;
53
65
  }
54
66
 
67
+ export interface MessageExtraContent {
68
+ /** Content to display before the main content */
69
+ beforeMainContent?: ReactNode;
70
+
71
+ /** Content to display after the main content */
72
+ afterMainContent?: ReactNode;
73
+
74
+ /** Content to display at the end */
75
+ endContent?: ReactNode;
76
+ }
77
+
55
78
  export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'role'> {
56
79
  /** Unique id for message */
57
80
  id?: string;
@@ -59,6 +82,8 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
59
82
  role: 'user' | 'bot';
60
83
  /** Message content */
61
84
  content?: string;
85
+ /** Extra Message content */
86
+ extraContent?: MessageExtraContent;
62
87
  /** Name of the user */
63
88
  name?: string;
64
89
  /** Avatar src for the user */
@@ -87,6 +112,10 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
87
112
  quickResponses?: QuickResponse[];
88
113
  /** Props for quick responses container */
89
114
  quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
115
+ /** Props for user feedback card */
116
+ userFeedbackForm?: Omit<UserFeedbackProps, 'ref'>;
117
+ /** Props for user feedback response */
118
+ userFeedbackComplete?: Omit<UserFeedbackCompleteProps, 'ref'>;
90
119
  /** Whether avatar is round */
91
120
  hasRoundAvatar?: boolean;
92
121
  /** Any additional props applied to the avatar, for additional customization */
@@ -104,11 +133,24 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
104
133
  onClick?: () => void;
105
134
  action?: QuickstartAction;
106
135
  };
136
+ /** Turns the container into a live region so that changes to content within the Message, such as appending a feedback card, are reliably announced to assistive technology. */
137
+ isLiveRegion?: boolean;
138
+ /** Ref applied to message */
139
+ innerRef?: React.Ref<HTMLDivElement>;
140
+ /** Props for table message. It is important to include a detailed aria-label that describes the purpose of the table. */
141
+ tableProps?: Required<Pick<TableProps, 'aria-label'>> & TableProps;
142
+ /** Additional rehype plugins passed from the consumer */
143
+ additionalRehypePlugins?: PluggableList;
144
+ /** Whether to open links in message in new tab. */
145
+ openLinkInNewTab?: boolean;
146
+ /** Optional inline error message that can be displayed in the message */
147
+ error?: AlertProps;
107
148
  }
108
149
 
109
- export const Message: React.FunctionComponent<MessageProps> = ({
150
+ export const MessageBase: React.FunctionComponent<MessageProps> = ({
110
151
  role,
111
152
  content,
153
+ extraContent,
112
154
  name,
113
155
  avatar,
114
156
  timestamp,
@@ -124,8 +166,24 @@ export const Message: React.FunctionComponent<MessageProps> = ({
124
166
  hasRoundAvatar = true,
125
167
  avatarProps,
126
168
  quickStarts,
169
+ userFeedbackForm,
170
+ userFeedbackComplete,
171
+ isLiveRegion = true,
172
+ innerRef,
173
+ tableProps,
174
+ openLinkInNewTab = true,
175
+ additionalRehypePlugins = [],
176
+ error,
127
177
  ...props
128
178
  }: MessageProps) => {
179
+ const { beforeMainContent, afterMainContent, endContent } = extraContent || {};
180
+ let rehypePlugins: PluggableList = [rehypeUnwrapImages];
181
+ if (openLinkInNewTab) {
182
+ rehypePlugins = rehypePlugins.concat([[rehypeExternalLinks, { target: '_blank' }, rehypeSanitize]]);
183
+ }
184
+ if (additionalRehypePlugins) {
185
+ rehypePlugins.push(...additionalRehypePlugins);
186
+ }
129
187
  let avatarClassName;
130
188
  if (avatarProps && 'className' in avatarProps) {
131
189
  const { className, ...rest } = avatarProps;
@@ -139,6 +197,9 @@ export const Message: React.FunctionComponent<MessageProps> = ({
139
197
  <section
140
198
  aria-label={`Message from ${role} - ${dateString}`}
141
199
  className={`pf-chatbot__message pf-chatbot__message--${role}`}
200
+ aria-live={isLiveRegion ? 'polite' : undefined}
201
+ aria-atomic={isLiveRegion ? false : undefined}
202
+ ref={innerRef}
142
203
  {...props}
143
204
  >
144
205
  {/* We are using an empty alt tag intentionally in order to reduce noise on screen readers */}
@@ -167,18 +228,55 @@ export const Message: React.FunctionComponent<MessageProps> = ({
167
228
  {isLoading ? (
168
229
  <MessageLoading loadingWord={loadingWord} />
169
230
  ) : (
170
- <Markdown
171
- components={{
172
- p: TextMessage,
173
- code: ({ children }) => <CodeBlockMessage {...codeBlockProps}>{children}</CodeBlockMessage>,
174
- ul: UnorderedListMessage,
175
- ol: (props) => <OrderedListMessage {...props} />,
176
- li: ListItemMessage
177
- }}
178
- remarkPlugins={[remarkGfm]}
179
- >
180
- {content}
181
- </Markdown>
231
+ <>
232
+ {beforeMainContent && <>{beforeMainContent}</>}
233
+ {error ? (
234
+ <ErrorMessage {...error} />
235
+ ) : (
236
+ <Markdown
237
+ components={{
238
+ p: (props) => <TextMessage component={ContentVariants.p} {...props} />,
239
+ code: ({ children, ...props }) => (
240
+ <CodeBlockMessage {...props} {...codeBlockProps}>
241
+ {children}
242
+ </CodeBlockMessage>
243
+ ),
244
+ h1: (props) => <TextMessage component={ContentVariants.h1} {...props} />,
245
+ h2: (props) => <TextMessage component={ContentVariants.h2} {...props} />,
246
+ h3: (props) => <TextMessage component={ContentVariants.h3} {...props} />,
247
+ h4: (props) => <TextMessage component={ContentVariants.h4} {...props} />,
248
+ h5: (props) => <TextMessage component={ContentVariants.h5} {...props} />,
249
+ h6: (props) => <TextMessage component={ContentVariants.h6} {...props} />,
250
+ blockquote: (props) => <TextMessage component={ContentVariants.blockquote} {...props} />,
251
+ ul: (props) => <UnorderedListMessage {...props} />,
252
+ ol: (props) => <OrderedListMessage {...props} />,
253
+ li: (props) => <ListItemMessage {...props} />,
254
+ table: (props) => <TableMessage {...props} {...tableProps} />,
255
+ tbody: (props) => <TbodyMessage {...props} />,
256
+ thead: (props) => <TheadMessage {...props} />,
257
+ tr: (props) => <TrMessage {...props} />,
258
+ td: (props) => {
259
+ // Conflicts with Td type
260
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
261
+ const { width, ...rest } = props;
262
+ return <TdMessage {...rest} />;
263
+ },
264
+ th: (props) => <ThMessage {...props} />,
265
+ img: (props) => <ImageMessage {...props} />,
266
+ a: (props) => (
267
+ <LinkMessage href={props.href} rel={props.rel} target={props.target}>
268
+ {props.children}
269
+ </LinkMessage>
270
+ )
271
+ }}
272
+ remarkPlugins={[remarkGfm]}
273
+ rehypePlugins={rehypePlugins}
274
+ >
275
+ {content}
276
+ </Markdown>
277
+ )}
278
+ {afterMainContent && <>{afterMainContent}</>}
279
+ </>
182
280
  )}
183
281
  {!isLoading && sources && <SourcesCard {...sources} />}
184
282
  {quickStarts && quickStarts.quickStart && (
@@ -193,17 +291,13 @@ export const Message: React.FunctionComponent<MessageProps> = ({
193
291
  />
194
292
  )}
195
293
  {!isLoading && actions && <ResponseActions actions={actions} />}
294
+ {userFeedbackForm && <UserFeedback {...userFeedbackForm} timestamp={dateString} />}
295
+ {userFeedbackComplete && <UserFeedbackComplete {...userFeedbackComplete} timestamp={dateString} />}
196
296
  {!isLoading && quickResponses && (
197
- <LabelGroup
198
- className={`pf-chatbot__message-quick-response ${quickResponseContainerProps?.className}`}
199
- {...quickResponseContainerProps}
200
- >
201
- {quickResponses.map(({ id, onClick, content, ...props }: QuickResponse) => (
202
- <Label variant="outline" color="blue" key={id} onClick={onClick} {...props}>
203
- {content}
204
- </Label>
205
- ))}
206
- </LabelGroup>
297
+ <QuickResponse
298
+ quickResponses={quickResponses}
299
+ quickResponseContainerProps={quickResponseContainerProps}
300
+ />
207
301
  )}
208
302
  </div>
209
303
  {attachments && (
@@ -224,10 +318,15 @@ export const Message: React.FunctionComponent<MessageProps> = ({
224
318
  ))}
225
319
  </div>
226
320
  )}
321
+ {!isLoading && endContent && <>{endContent}</>}
227
322
  </div>
228
323
  </div>
229
324
  </section>
230
325
  );
231
326
  };
232
327
 
328
+ const Message = React.forwardRef((props: MessageProps, ref: React.Ref<HTMLDivElement>) => (
329
+ <MessageBase innerRef={ref} {...props} />
330
+ ));
331
+
233
332
  export default Message;
@@ -3,9 +3,9 @@
3
3
  // ============================================================================
4
4
  .pf-chatbot__message-loading {
5
5
  width: 36px;
6
- padding: var(--pf-t--chatbot-message--type--padding);
6
+ padding: var(--pf-t--global--spacer--sm);
7
7
  background-color: var(--pf-t--global--background--color--tertiary--default);
8
- border-radius: var(--pf-t--chatbot-message--type--border--radius);
8
+ border-radius: var(--pf-t--global--border--radius--small);
9
9
 
10
10
  &-dots {
11
11
  position: relative;
@@ -0,0 +1,33 @@
1
+ .pf-chatbot__message-quick-response {
2
+ .pf-v6-c-label {
3
+ --pf-v6-c-label--FontSize: var(--pf-t--global--font--size--md);
4
+
5
+ @media screen and (min-width: 401px) and (max-width: 600px) {
6
+ --pf-v6-c-label__text--MaxWidth: 20ch;
7
+ }
8
+
9
+ @media screen and (max-width: 400px) {
10
+ --pf-v6-c-label__text--MaxWidth: 15ch;
11
+ }
12
+ }
13
+
14
+ .pf-chatbot__message-quick-response--selected {
15
+ .pf-v6-c-label__content:is(:hover, :focus) {
16
+ --pf-v6-c-label--m-clickable--hover--BorderWidth: 0;
17
+ --pf-v6-c-label--BackgroundColor: var(--pf-v6-c-label--m-blue--BackgroundColor);
18
+ }
19
+ }
20
+
21
+ .pf-chatbot__message-quick-response--selected:hover,
22
+ .pf-chatbot__message-quick-response--selected:focus {
23
+ --pf-v6-c-label--m-clickable--hover--BorderWidth: 0;
24
+ --pf-v6-c-label--BackgroundColor: var(--pf-v6-c-label--m-blue--BackgroundColor);
25
+ }
26
+
27
+ // active state right before selection
28
+ .pf-v6-c-label.pf-m-blue.pf-m-clickable .pf-v6-c-label__content:is(:active) {
29
+ --pf-v6-c-label--BackgroundColor: var(--pf-v6-c-label--m-blue--BackgroundColor);
30
+ --pf-v6-c-label--m-clickable--hover--BackgroundColor: var(--pf-v6-c-label--m-blue--BackgroundColor);
31
+ --pf-v6-c-label--m-clickable--hover--BorderWidth: 0;
32
+ }
33
+ }