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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (464) 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.test.d.ts +1 -0
  4. package/dist/cjs/Chatbot/Chatbot.test.js +28 -0
  5. package/dist/cjs/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
  6. package/dist/cjs/ChatbotAlert/ChatbotAlert.test.js +27 -0
  7. package/dist/cjs/ChatbotContent/ChatbotContent.test.d.ts +1 -0
  8. package/dist/cjs/ChatbotContent/ChatbotContent.test.js +18 -0
  9. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
  10. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
  11. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
  12. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +23 -11
  13. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
  14. package/dist/cjs/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
  15. package/dist/cjs/ChatbotConversationHistoryNav/EmptyState.js +29 -0
  16. package/dist/cjs/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
  17. package/dist/cjs/ChatbotConversationHistoryNav/LoadingState.js +45 -0
  18. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  19. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +18 -0
  20. package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  21. package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.js +87 -0
  22. package/dist/cjs/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
  23. package/dist/cjs/ChatbotFooter/ChatbotFootnote.js +1 -1
  24. package/dist/cjs/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  25. package/dist/cjs/ChatbotHeader/ChatbotHeader.test.js +18 -0
  26. package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  27. package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.js +18 -0
  28. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +17 -0
  29. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +16 -0
  30. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  31. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.js +20 -0
  32. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  33. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.js +18 -0
  34. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.d.ts +2 -0
  35. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +4 -2
  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.test.d.ts +1 -0
  45. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.js +47 -0
  46. package/dist/cjs/ChatbotHeader/index.d.ts +1 -0
  47. package/dist/cjs/ChatbotHeader/index.js +1 -0
  48. package/dist/cjs/ChatbotToggle/ChatbotToggle.js +3 -1
  49. package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
  50. package/dist/cjs/CodeModal/CodeModal.js +2 -12
  51. package/dist/cjs/Compare/Compare.d.ts +17 -0
  52. package/dist/cjs/Compare/Compare.js +50 -0
  53. package/dist/cjs/Compare/Compare.test.d.ts +1 -0
  54. package/dist/cjs/Compare/Compare.test.js +20 -0
  55. package/dist/cjs/Compare/index.d.ts +2 -0
  56. package/dist/cjs/Compare/index.js +23 -0
  57. package/dist/cjs/Message/ImageMessage/ImageMessage.d.ts +4 -0
  58. package/dist/cjs/Message/ImageMessage/ImageMessage.js +25 -0
  59. package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +4 -0
  60. package/dist/cjs/Message/LinkMessage/LinkMessage.js +30 -0
  61. package/dist/cjs/Message/ListMessage/OrderedListMessage.d.ts +1 -1
  62. package/dist/cjs/Message/ListMessage/OrderedListMessage.js +2 -2
  63. package/dist/cjs/Message/Message.d.ts +47 -8
  64. package/dist/cjs/Message/Message.js +69 -18
  65. package/dist/cjs/Message/Message.test.js +265 -3
  66. package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +17 -0
  67. package/dist/cjs/Message/QuickResponse/QuickResponse.js +34 -0
  68. package/dist/cjs/Message/QuickStarts/FallbackImg.d.ts +13 -0
  69. package/dist/cjs/Message/QuickStarts/FallbackImg.js +34 -0
  70. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  71. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +82 -0
  72. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  73. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.js +64 -0
  74. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  75. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.js +76 -0
  76. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  77. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.js +30 -0
  78. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  79. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +77 -0
  80. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  81. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.js +77 -0
  82. package/dist/cjs/Message/QuickStarts/types.d.ts +132 -0
  83. package/dist/cjs/Message/QuickStarts/types.js +17 -0
  84. package/dist/cjs/Message/TableMessage/TableMessage.d.ts +20 -0
  85. package/dist/cjs/Message/TableMessage/TableMessage.js +67 -0
  86. package/dist/cjs/Message/TableMessage/TbodyMessage.d.ts +7 -0
  87. package/dist/cjs/Message/TableMessage/TbodyMessage.js +33 -0
  88. package/dist/cjs/Message/TableMessage/TdMessage.d.ts +5 -0
  89. package/dist/cjs/Message/TableMessage/TdMessage.js +26 -0
  90. package/dist/cjs/Message/TableMessage/ThMessage.d.ts +5 -0
  91. package/dist/cjs/Message/TableMessage/ThMessage.js +26 -0
  92. package/dist/cjs/Message/TableMessage/TheadMessage.d.ts +5 -0
  93. package/dist/cjs/Message/TableMessage/TheadMessage.js +26 -0
  94. package/dist/cjs/Message/TableMessage/TrMessage.d.ts +7 -0
  95. package/dist/cjs/Message/TableMessage/TrMessage.js +37 -0
  96. package/dist/cjs/Message/TextMessage/TextMessage.d.ts +2 -1
  97. package/dist/cjs/Message/TextMessage/TextMessage.js +2 -2
  98. package/dist/cjs/Message/UserFeedback/CloseButton.d.ts +10 -0
  99. package/dist/cjs/Message/UserFeedback/CloseButton.js +14 -0
  100. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +39 -0
  101. package/dist/cjs/Message/UserFeedback/UserFeedback.js +55 -0
  102. package/dist/cjs/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  103. package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +146 -0
  104. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  105. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +117 -0
  106. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  107. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +249 -0
  108. package/dist/cjs/MessageBar/AttachButton.js +4 -2
  109. package/dist/cjs/MessageBar/MessageBar.d.ts +11 -4
  110. package/dist/cjs/MessageBar/MessageBar.js +122 -39
  111. package/dist/cjs/MessageBar/MessageBar.test.js +12 -4
  112. package/dist/cjs/MessageBar/MicrophoneButton.d.ts +1 -1
  113. package/dist/cjs/MessageBar/SendButton.js +3 -1
  114. package/dist/cjs/MessageBar/StopButton.js +3 -1
  115. package/dist/cjs/MessageBox/MessageBox.test.d.ts +1 -0
  116. package/dist/cjs/MessageBox/MessageBox.test.js +22 -0
  117. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  118. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.js +28 -0
  119. package/dist/cjs/ResponseActions/ResponseActionButton.d.ts +10 -1
  120. package/dist/cjs/ResponseActions/ResponseActionButton.js +28 -5
  121. package/dist/cjs/ResponseActions/ResponseActionButton.test.d.ts +1 -0
  122. package/dist/cjs/ResponseActions/ResponseActionButton.test.js +54 -0
  123. package/dist/cjs/ResponseActions/ResponseActions.d.ts +12 -2
  124. package/dist/cjs/ResponseActions/ResponseActions.js +26 -9
  125. package/dist/cjs/ResponseActions/ResponseActions.test.js +79 -5
  126. package/dist/cjs/Settings/SettingsForm.d.ts +13 -0
  127. package/dist/cjs/Settings/SettingsForm.js +27 -0
  128. package/dist/cjs/Settings/SettingsForm.test.d.ts +1 -0
  129. package/dist/cjs/Settings/SettingsForm.test.js +26 -0
  130. package/dist/cjs/Settings/index.d.ts +2 -0
  131. package/dist/cjs/Settings/index.js +23 -0
  132. package/dist/cjs/TermsOfUse/TermsOfUse.d.ts +34 -0
  133. package/dist/cjs/TermsOfUse/TermsOfUse.js +49 -0
  134. package/dist/cjs/TermsOfUse/TermsOfUse.test.d.ts +1 -0
  135. package/dist/cjs/TermsOfUse/TermsOfUse.test.js +79 -0
  136. package/dist/cjs/TermsOfUse/index.d.ts +2 -0
  137. package/dist/cjs/TermsOfUse/index.js +23 -0
  138. package/dist/cjs/__mocks__/rehype-external-links.d.ts +2 -0
  139. package/dist/cjs/__mocks__/rehype-external-links.js +4 -0
  140. package/dist/cjs/__mocks__/rehype-sanitize.d.ts +2 -0
  141. package/dist/cjs/__mocks__/rehype-sanitize.js +4 -0
  142. package/dist/cjs/__mocks__/rehype-unwrap-images.d.ts +2 -0
  143. package/dist/cjs/__mocks__/rehype-unwrap-images.js +4 -0
  144. package/dist/cjs/index.d.ts +6 -0
  145. package/dist/cjs/index.js +10 -1
  146. package/dist/css/main.css +467 -123
  147. package/dist/css/main.css.map +1 -1
  148. package/dist/dynamic/Compare/package.json +1 -0
  149. package/dist/dynamic/Settings/package.json +1 -0
  150. package/dist/dynamic/TermsOfUse/package.json +1 -0
  151. package/dist/esm/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
  152. package/dist/esm/AttachmentEdit/AttachmentEdit.test.js +47 -0
  153. package/dist/esm/Chatbot/Chatbot.test.d.ts +1 -0
  154. package/dist/esm/Chatbot/Chatbot.test.js +23 -0
  155. package/dist/esm/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
  156. package/dist/esm/ChatbotAlert/ChatbotAlert.test.js +22 -0
  157. package/dist/esm/ChatbotContent/ChatbotContent.test.d.ts +1 -0
  158. package/dist/esm/ChatbotContent/ChatbotContent.test.js +13 -0
  159. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
  160. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
  161. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
  162. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +23 -11
  163. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
  164. package/dist/esm/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
  165. package/dist/esm/ChatbotConversationHistoryNav/EmptyState.js +22 -0
  166. package/dist/esm/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
  167. package/dist/esm/ChatbotConversationHistoryNav/LoadingState.js +38 -0
  168. package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  169. package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +13 -0
  170. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  171. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.js +82 -0
  172. package/dist/esm/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
  173. package/dist/esm/ChatbotFooter/ChatbotFootnote.js +1 -1
  174. package/dist/esm/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  175. package/dist/esm/ChatbotHeader/ChatbotHeader.test.js +13 -0
  176. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  177. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.js +13 -0
  178. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +17 -0
  179. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +10 -0
  180. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  181. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +15 -0
  182. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  183. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.js +13 -0
  184. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.d.ts +2 -0
  185. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +4 -2
  186. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
  187. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +15 -0
  188. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
  189. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
  190. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +38 -0
  191. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +6 -4
  192. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
  193. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +36 -0
  194. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
  195. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.js +42 -0
  196. package/dist/esm/ChatbotHeader/index.d.ts +1 -0
  197. package/dist/esm/ChatbotHeader/index.js +1 -0
  198. package/dist/esm/ChatbotToggle/ChatbotToggle.js +3 -1
  199. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
  200. package/dist/esm/CodeModal/CodeModal.js +2 -12
  201. package/dist/esm/Compare/Compare.d.ts +17 -0
  202. package/dist/esm/Compare/Compare.js +43 -0
  203. package/dist/esm/Compare/Compare.test.d.ts +1 -0
  204. package/dist/esm/Compare/Compare.test.js +15 -0
  205. package/dist/esm/Compare/index.d.ts +2 -0
  206. package/dist/esm/Compare/index.js +2 -0
  207. package/dist/esm/Message/ImageMessage/ImageMessage.d.ts +4 -0
  208. package/dist/esm/Message/ImageMessage/ImageMessage.js +20 -0
  209. package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +4 -0
  210. package/dist/esm/Message/LinkMessage/LinkMessage.js +25 -0
  211. package/dist/esm/Message/ListMessage/OrderedListMessage.d.ts +1 -1
  212. package/dist/esm/Message/ListMessage/OrderedListMessage.js +2 -2
  213. package/dist/esm/Message/Message.d.ts +47 -8
  214. package/dist/esm/Message/Message.js +67 -16
  215. package/dist/esm/Message/Message.test.js +265 -3
  216. package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +17 -0
  217. package/dist/esm/Message/QuickResponse/QuickResponse.js +27 -0
  218. package/dist/esm/Message/QuickStarts/FallbackImg.d.ts +13 -0
  219. package/dist/esm/Message/QuickStarts/FallbackImg.js +9 -0
  220. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  221. package/dist/esm/Message/QuickStarts/QuickStartTile.js +52 -0
  222. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  223. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.js +35 -0
  224. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  225. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.js +48 -0
  226. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  227. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.js +5 -0
  228. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  229. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +74 -0
  230. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  231. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.js +74 -0
  232. package/dist/esm/Message/QuickStarts/types.d.ts +132 -0
  233. package/dist/esm/Message/QuickStarts/types.js +14 -0
  234. package/dist/esm/Message/TableMessage/TableMessage.d.ts +20 -0
  235. package/dist/esm/Message/TableMessage/TableMessage.js +62 -0
  236. package/dist/esm/Message/TableMessage/TbodyMessage.d.ts +7 -0
  237. package/dist/esm/Message/TableMessage/TbodyMessage.js +28 -0
  238. package/dist/esm/Message/TableMessage/TdMessage.d.ts +5 -0
  239. package/dist/esm/Message/TableMessage/TdMessage.js +21 -0
  240. package/dist/esm/Message/TableMessage/ThMessage.d.ts +5 -0
  241. package/dist/esm/Message/TableMessage/ThMessage.js +21 -0
  242. package/dist/esm/Message/TableMessage/TheadMessage.d.ts +5 -0
  243. package/dist/esm/Message/TableMessage/TheadMessage.js +21 -0
  244. package/dist/esm/Message/TableMessage/TrMessage.d.ts +7 -0
  245. package/dist/esm/Message/TableMessage/TrMessage.js +32 -0
  246. package/dist/esm/Message/TextMessage/TextMessage.d.ts +2 -1
  247. package/dist/esm/Message/TextMessage/TextMessage.js +3 -3
  248. package/dist/esm/Message/UserFeedback/CloseButton.d.ts +10 -0
  249. package/dist/esm/Message/UserFeedback/CloseButton.js +9 -0
  250. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +39 -0
  251. package/dist/esm/Message/UserFeedback/UserFeedback.js +50 -0
  252. package/dist/esm/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  253. package/dist/esm/Message/UserFeedback/UserFeedback.test.js +141 -0
  254. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  255. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +112 -0
  256. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  257. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +244 -0
  258. package/dist/esm/MessageBar/AttachButton.js +4 -2
  259. package/dist/esm/MessageBar/MessageBar.d.ts +11 -4
  260. package/dist/esm/MessageBar/MessageBar.js +122 -39
  261. package/dist/esm/MessageBar/MessageBar.test.js +12 -4
  262. package/dist/esm/MessageBar/MicrophoneButton.d.ts +1 -1
  263. package/dist/esm/MessageBar/SendButton.js +3 -1
  264. package/dist/esm/MessageBar/StopButton.js +3 -1
  265. package/dist/esm/MessageBox/MessageBox.test.d.ts +1 -0
  266. package/dist/esm/MessageBox/MessageBox.test.js +17 -0
  267. package/dist/esm/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  268. package/dist/esm/PreviewAttachment/PreviewAttachment.test.js +23 -0
  269. package/dist/esm/ResponseActions/ResponseActionButton.d.ts +10 -1
  270. package/dist/esm/ResponseActions/ResponseActionButton.js +25 -2
  271. package/dist/esm/ResponseActions/ResponseActionButton.test.d.ts +1 -0
  272. package/dist/esm/ResponseActions/ResponseActionButton.test.js +49 -0
  273. package/dist/esm/ResponseActions/ResponseActions.d.ts +12 -2
  274. package/dist/esm/ResponseActions/ResponseActions.js +26 -9
  275. package/dist/esm/ResponseActions/ResponseActions.test.js +79 -5
  276. package/dist/esm/Settings/SettingsForm.d.ts +13 -0
  277. package/dist/esm/Settings/SettingsForm.js +20 -0
  278. package/dist/esm/Settings/SettingsForm.test.d.ts +1 -0
  279. package/dist/esm/Settings/SettingsForm.test.js +21 -0
  280. package/dist/esm/Settings/index.d.ts +2 -0
  281. package/dist/esm/Settings/index.js +2 -0
  282. package/dist/esm/TermsOfUse/TermsOfUse.d.ts +34 -0
  283. package/dist/esm/TermsOfUse/TermsOfUse.js +42 -0
  284. package/dist/esm/TermsOfUse/TermsOfUse.test.d.ts +1 -0
  285. package/dist/esm/TermsOfUse/TermsOfUse.test.js +74 -0
  286. package/dist/esm/TermsOfUse/index.d.ts +2 -0
  287. package/dist/esm/TermsOfUse/index.js +2 -0
  288. package/dist/esm/__mocks__/rehype-external-links.d.ts +2 -0
  289. package/dist/esm/__mocks__/rehype-external-links.js +2 -0
  290. package/dist/esm/__mocks__/rehype-sanitize.d.ts +2 -0
  291. package/dist/esm/__mocks__/rehype-sanitize.js +2 -0
  292. package/dist/esm/__mocks__/rehype-unwrap-images.d.ts +2 -0
  293. package/dist/esm/__mocks__/rehype-unwrap-images.js +2 -0
  294. package/dist/esm/index.d.ts +6 -0
  295. package/dist/esm/index.js +6 -0
  296. package/dist/tsconfig.tsbuildinfo +1 -1
  297. package/package.json +10 -13
  298. package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +5 -2
  299. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +41 -4
  300. package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentError.tsx +2 -2
  301. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +191 -12
  302. package/patternfly-docs/content/extensions/chatbot/examples/Messages/FileDropZone.tsx +2 -1
  303. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithAttachment.tsx +2 -2
  304. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomResponseActions.tsx +5 -1
  305. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +71 -0
  306. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedbackTimeout.tsx +27 -0
  307. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +1 -1
  308. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +31 -0
  309. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithResponseActions.tsx +1 -1
  310. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +1 -1
  311. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +74 -11
  312. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +221 -14
  313. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +54 -0
  314. package/patternfly-docs/content/extensions/chatbot/examples/Messages/explore-pipeline-quickstart.ts +65 -0
  315. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFooter.tsx +1 -1
  316. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFootnote.tsx +5 -5
  317. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderBasic.tsx +1 -1
  318. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +36 -3
  319. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerNavigation.tsx +67 -0
  320. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +94 -0
  321. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarAttach.tsx +1 -1
  322. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomeInteraction.tsx +1 -1
  323. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomePrompt.tsx +7 -7
  324. package/patternfly-docs/content/extensions/chatbot/examples/UI/PF-TermsAndConditionsHeader.svg +148 -0
  325. package/patternfly-docs/content/extensions/chatbot/examples/UI/Settings.tsx +289 -0
  326. package/patternfly-docs/content/extensions/chatbot/examples/UI/SquareChatbotToggle.tsx +1 -1
  327. package/patternfly-docs/content/extensions/chatbot/examples/UI/TermsOfUse.tsx +147 -0
  328. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +49 -6
  329. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +14 -0
  330. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +26 -3
  331. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +11 -11
  332. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +21 -20
  333. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +3 -3
  334. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +11 -11
  335. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +206 -0
  336. package/patternfly-docs/content/extensions/chatbot/examples/demos/Feedback.tsx +104 -0
  337. package/patternfly-docs/content/extensions/chatbot/img/attached-file.svg +24 -29
  338. package/patternfly-docs/content/extensions/chatbot/img/attachment-menu.svg +4 -4
  339. package/patternfly-docs/content/extensions/chatbot/img/attachment-unsent.svg +30 -57
  340. package/patternfly-docs/content/extensions/chatbot/img/chatbot-elements.svg +5 -5
  341. package/patternfly-docs/content/extensions/chatbot/img/chatbot-quickstarts-tile.svg +58 -0
  342. package/patternfly-docs/content/extensions/chatbot/img/chatbot-settings.svg +83 -0
  343. package/patternfly-docs/content/extensions/chatbot/img/conversation-history.svg +6 -29
  344. package/patternfly-docs/content/extensions/chatbot/img/docked.svg +68 -49
  345. package/patternfly-docs/content/extensions/chatbot/img/footnote.svg +1 -1
  346. package/patternfly-docs/content/extensions/chatbot/img/fullscreen.svg +25 -16
  347. package/patternfly-docs/content/extensions/chatbot/img/listening.svg +1 -1
  348. package/patternfly-docs/content/extensions/chatbot/img/message-bar-elements.svg +3 -3
  349. package/patternfly-docs/content/extensions/chatbot/img/message-elements.svg +85 -142
  350. package/patternfly-docs/content/extensions/chatbot/img/overlay.svg +52 -36
  351. package/patternfly-docs/content/extensions/chatbot/img/settings-menu.svg +122 -0
  352. package/patternfly-docs/content/extensions/chatbot/img/source-tile.svg +62 -0
  353. package/patternfly-docs/content/extensions/chatbot/img/toggle-customizations.svg +12 -0
  354. package/src/AttachMenu/AttachMenu.scss +1 -1
  355. package/src/AttachmentEdit/AttachmentEdit.test.tsx +55 -0
  356. package/src/Chatbot/Chatbot.scss +1 -1
  357. package/src/Chatbot/Chatbot.test.tsx +31 -0
  358. package/src/ChatbotAlert/ChatbotAlert.test.tsx +31 -0
  359. package/src/ChatbotContent/ChatbotContent.test.tsx +15 -0
  360. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx +10 -4
  361. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +22 -1
  362. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +242 -3
  363. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +93 -25
  364. package/src/ChatbotConversationHistoryNav/EmptyState.tsx +44 -0
  365. package/src/ChatbotConversationHistoryNav/LoadingState.tsx +38 -0
  366. package/src/ChatbotFooter/ChatbotFooter.scss +0 -5
  367. package/src/ChatbotFooter/ChatbotFooter.test.tsx +15 -0
  368. package/src/ChatbotFooter/ChatbotFooternote.test.tsx +84 -0
  369. package/src/ChatbotFooter/ChatbotFootnote.tsx +2 -2
  370. package/src/ChatbotHeader/ChatbotHeader.scss +2 -5
  371. package/src/ChatbotHeader/ChatbotHeader.test.tsx +15 -0
  372. package/src/ChatbotHeader/ChatbotHeaderActions.test.tsx +17 -0
  373. package/src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx +20 -0
  374. package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +57 -0
  375. package/src/ChatbotHeader/ChatbotHeaderMain.test.tsx +17 -0
  376. package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +19 -0
  377. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +11 -2
  378. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx +45 -0
  379. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx +8 -1
  380. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx +43 -0
  381. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx +11 -4
  382. package/src/ChatbotHeader/ChatbotHeaderTitle.test.tsx +59 -0
  383. package/src/ChatbotHeader/index.ts +1 -0
  384. package/src/ChatbotModal/ChatbotModal.scss +1 -1
  385. package/src/ChatbotToggle/ChatbotToggle.tsx +6 -1
  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 +9 -1
  389. package/src/CodeModal/CodeModal.tsx +2 -13
  390. package/src/Compare/Compare.scss +72 -0
  391. package/src/Compare/Compare.test.tsx +31 -0
  392. package/src/Compare/Compare.tsx +98 -0
  393. package/src/Compare/index.ts +2 -0
  394. package/src/FileDetails/FileDetails.scss +1 -1
  395. package/src/FileDropZone/__snapshots__/FileDropZone.test.tsx.snap +1 -1
  396. package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +4 -4
  397. package/src/Message/ImageMessage/ImageMessage.scss +9 -0
  398. package/src/Message/ImageMessage/ImageMessage.tsx +14 -0
  399. package/src/Message/LinkMessage/LinkMessage.tsx +34 -0
  400. package/src/Message/ListMessage/ListMessage.scss +6 -6
  401. package/src/Message/ListMessage/OrderedListMessage.tsx +2 -2
  402. package/src/Message/Message.scss +4 -26
  403. package/src/Message/Message.test.tsx +357 -3
  404. package/src/Message/Message.tsx +148 -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/FallbackImg.tsx +24 -0
  409. package/src/Message/QuickStarts/QuickStartTile.scss +24 -0
  410. package/src/Message/QuickStarts/QuickStartTile.tsx +147 -0
  411. package/src/Message/QuickStarts/QuickStartTileDescription.test.tsx +57 -0
  412. package/src/Message/QuickStarts/QuickStartTileDescription.tsx +81 -0
  413. package/src/Message/QuickStarts/QuickStartTileHeader.tsx +21 -0
  414. package/src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts +75 -0
  415. package/src/Message/QuickStarts/monitor-sampleapp-quickstart.ts +75 -0
  416. package/src/Message/QuickStarts/types.ts +154 -0
  417. package/src/Message/TableMessage/TableMessage.scss +23 -0
  418. package/src/Message/TableMessage/TableMessage.tsx +83 -0
  419. package/src/Message/TableMessage/TbodyMessage.tsx +20 -0
  420. package/src/Message/TableMessage/TdMessage.tsx +11 -0
  421. package/src/Message/TableMessage/ThMessage.tsx +11 -0
  422. package/src/Message/TableMessage/TheadMessage.tsx +11 -0
  423. package/src/Message/TableMessage/TrMessage.tsx +27 -0
  424. package/src/Message/TextMessage/TextMessage.scss +21 -12
  425. package/src/Message/TextMessage/TextMessage.tsx +3 -3
  426. package/src/Message/UserFeedback/CloseButton.tsx +21 -0
  427. package/src/Message/UserFeedback/UserFeedback.scss +53 -0
  428. package/src/Message/UserFeedback/UserFeedback.test.tsx +257 -0
  429. package/src/Message/UserFeedback/UserFeedback.tsx +132 -0
  430. package/src/Message/UserFeedback/UserFeedbackComplete.test.tsx +255 -0
  431. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +211 -0
  432. package/src/MessageBar/AttachButton.scss +19 -3
  433. package/src/MessageBar/AttachButton.tsx +3 -1
  434. package/src/MessageBar/MessageBar.scss +38 -20
  435. package/src/MessageBar/MessageBar.test.tsx +12 -4
  436. package/src/MessageBar/MessageBar.tsx +153 -58
  437. package/src/MessageBar/MicrophoneButton.scss +8 -8
  438. package/src/MessageBar/MicrophoneButton.tsx +1 -1
  439. package/src/MessageBar/SendButton.tsx +2 -0
  440. package/src/MessageBar/StopButton.scss +17 -3
  441. package/src/MessageBar/StopButton.tsx +2 -0
  442. package/src/MessageBox/JumpButton.scss +6 -6
  443. package/src/MessageBox/MessageBox.test.tsx +26 -0
  444. package/src/PreviewAttachment/PreviewAttachment.test.tsx +51 -0
  445. package/src/ResponseActions/ResponseActionButton.test.tsx +52 -0
  446. package/src/ResponseActions/ResponseActionButton.tsx +59 -28
  447. package/src/ResponseActions/ResponseActions.scss +11 -9
  448. package/src/ResponseActions/ResponseActions.test.tsx +105 -5
  449. package/src/ResponseActions/ResponseActions.tsx +80 -9
  450. package/src/Settings/Settings.scss +34 -0
  451. package/src/Settings/SettingsForm.test.tsx +28 -0
  452. package/src/Settings/SettingsForm.tsx +25 -0
  453. package/src/Settings/index.ts +3 -0
  454. package/src/SourceDetailsMenuItem/SourceDetailsMenuItem.scss +1 -1
  455. package/src/SourcesCard/SourcesCard.scss +2 -2
  456. package/src/TermsOfUse/TermsOfUse.scss +66 -0
  457. package/src/TermsOfUse/TermsOfUse.test.tsx +138 -0
  458. package/src/TermsOfUse/TermsOfUse.tsx +117 -0
  459. package/src/TermsOfUse/index.ts +3 -0
  460. package/src/__mocks__/rehype-external-links.ts +3 -0
  461. package/src/__mocks__/rehype-sanitize.ts +3 -0
  462. package/src/__mocks__/rehype-unwrap-images.tsx +3 -0
  463. package/src/index.ts +9 -0
  464. package/src/main.scss +8 -6
@@ -0,0 +1,2 @@
1
+ export { default } from './Compare';
2
+ export * from './Compare';
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { ExtraProps } from 'react-markdown';
3
+ declare const ImageMessage: ({ children, ...props }: JSX.IntrinsicElements["img"] & ExtraProps) => React.JSX.Element;
4
+ export default ImageMessage;
@@ -0,0 +1,20 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Image
3
+ // ============================================================================
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import React from 'react';
16
+ const ImageMessage = (_a) => {
17
+ var { children } = _a, props = __rest(_a, ["children"]);
18
+ return (React.createElement("img", Object.assign({ className: "pf-chatbot__message-image" }, props), children));
19
+ };
20
+ export default ImageMessage;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { ButtonProps } from '@patternfly/react-core';
3
+ declare const LinkMessage: ({ children, target, href, ...props }: ButtonProps) => React.JSX.Element;
4
+ export default LinkMessage;
@@ -0,0 +1,25 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Link
3
+ // ============================================================================
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import React from 'react';
16
+ import { Button } from '@patternfly/react-core';
17
+ import { ExternalLinkSquareAltIcon } from '@patternfly/react-icons';
18
+ const LinkMessage = (_a) => {
19
+ var { children, target, href } = _a, props = __rest(_a, ["children", "target", "href"]);
20
+ if (target === '_blank') {
21
+ return (React.createElement(Button, Object.assign({ component: "a", variant: "link", href: href, icon: React.createElement(ExternalLinkSquareAltIcon, null), iconPosition: "end", isInline: true, target: target }, props), children));
22
+ }
23
+ return (React.createElement(Button, Object.assign({ isInline: true, component: "a", href: href, variant: "link" }, props), children));
24
+ };
25
+ export default LinkMessage;
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  import { ExtraProps } from 'react-markdown';
3
- declare const OrderedListMessage: ({ children }: JSX.IntrinsicElements["ol"] & ExtraProps) => React.JSX.Element;
3
+ declare const OrderedListMessage: ({ children, start }: JSX.IntrinsicElements["ol"] & ExtraProps) => React.JSX.Element;
4
4
  export default OrderedListMessage;
@@ -3,6 +3,6 @@
3
3
  // ============================================================================
4
4
  import React from 'react';
5
5
  import { List, ListComponent, OrderType } from '@patternfly/react-core';
6
- const OrderedListMessage = ({ children }) => (React.createElement("div", { className: "pf-chatbot__message-ordered-list" },
7
- React.createElement(List, { component: ListComponent.ol, type: OrderType.number }, children)));
6
+ const OrderedListMessage = ({ children, start }) => (React.createElement("div", { className: "pf-chatbot__message-ordered-list" },
7
+ React.createElement(List, { component: ListComponent.ol, type: OrderType.number, start: start }, children)));
8
8
  export default OrderedListMessage;
@@ -1,12 +1,13 @@
1
- import React from 'react';
2
- import { AvatarProps, LabelGroupProps, LabelProps } from '@patternfly/react-core';
1
+ import React, { ReactNode } from 'react';
2
+ import { AvatarProps, LabelGroupProps } from '@patternfly/react-core';
3
3
  import { ActionProps } from '../ResponseActions/ResponseActions';
4
4
  import { SourcesCardProps } from '../SourcesCard';
5
- export interface QuickResponse extends Omit<LabelProps, 'children'> {
6
- content: string;
7
- id: string;
8
- onClick: () => void;
9
- }
5
+ import { QuickStart, QuickstartAction } from './QuickStarts/types';
6
+ import QuickResponse from './QuickResponse/QuickResponse';
7
+ import { UserFeedbackProps } from './UserFeedback/UserFeedback';
8
+ import { UserFeedbackCompleteProps } from './UserFeedback/UserFeedbackComplete';
9
+ import { TableProps } from '@patternfly/react-table';
10
+ import { PluggableList } from 'react-markdown/lib';
10
11
  export interface MessageAttachment {
11
12
  /** Name of file attached to the message */
12
13
  name: string;
@@ -25,6 +26,14 @@ export interface MessageAttachment {
25
26
  /** Custom test id for the loading spinner in the attachment component */
26
27
  spinnerTestId?: string;
27
28
  }
29
+ export interface MessageExtraContent {
30
+ /** Content to display before the main content */
31
+ beforeMainContent?: ReactNode;
32
+ /** Content to display after the main content */
33
+ afterMainContent?: ReactNode;
34
+ /** Content to display at the end */
35
+ endContent?: ReactNode;
36
+ }
28
37
  export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'role'> {
29
38
  /** Unique id for message */
30
39
  id?: string;
@@ -32,6 +41,8 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
32
41
  role: 'user' | 'bot';
33
42
  /** Message content */
34
43
  content?: string;
44
+ /** Extra Message content */
45
+ extraContent?: MessageExtraContent;
35
46
  /** Name of the user */
36
47
  name?: string;
37
48
  /** Avatar src for the user */
@@ -60,10 +71,38 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
60
71
  quickResponses?: QuickResponse[];
61
72
  /** Props for quick responses container */
62
73
  quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
74
+ /** Props for user feedback card */
75
+ userFeedbackForm?: Omit<UserFeedbackProps, 'ref'>;
76
+ /** Props for user feedback response */
77
+ userFeedbackComplete?: Omit<UserFeedbackCompleteProps, 'ref'>;
63
78
  /** Whether avatar is round */
64
79
  hasRoundAvatar?: boolean;
65
80
  /** Any additional props applied to the avatar, for additional customization */
66
81
  avatarProps?: Omit<AvatarProps, 'alt'>;
82
+ /** Props for QuickStart card */
83
+ quickStarts?: {
84
+ quickStart: QuickStart;
85
+ onSelectQuickStart: (id?: string) => void;
86
+ minuteWord?: string;
87
+ minuteWordPlural?: string;
88
+ prerequisiteWord?: string;
89
+ prerequisiteWordPlural?: string;
90
+ quickStartButtonAriaLabel?: string;
91
+ className?: string;
92
+ onClick?: () => void;
93
+ action?: QuickstartAction;
94
+ };
95
+ /** 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. */
96
+ isLiveRegion?: boolean;
97
+ /** Ref applied to message */
98
+ innerRef?: React.Ref<HTMLDivElement>;
99
+ /** Props for table message. It is important to include a detailed aria-label that describes the purpose of the table. */
100
+ tableProps?: Required<Pick<TableProps, 'aria-label'>> & TableProps;
101
+ /** Additional rehype plugins passed from the consumer */
102
+ additionalRehypePlugins?: PluggableList;
103
+ /** Whether to open links in message in new tab. */
104
+ openLinkInNewTab?: boolean;
67
105
  }
68
- export declare const Message: React.FunctionComponent<MessageProps>;
106
+ export declare const MessageBase: React.FunctionComponent<MessageProps>;
107
+ declare const Message: React.ForwardRefExoticComponent<Omit<MessageProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
69
108
  export default Message;
@@ -15,7 +15,7 @@ var __rest = (this && this.__rest) || function (s, e) {
15
15
  import React from 'react';
16
16
  import Markdown from 'react-markdown';
17
17
  import remarkGfm from 'remark-gfm';
18
- import { Avatar, Label, LabelGroup, Timestamp, Truncate } from '@patternfly/react-core';
18
+ import { Avatar, ContentVariants, Label, Timestamp, Truncate } from '@patternfly/react-core';
19
19
  import MessageLoading from './MessageLoading';
20
20
  import CodeBlockMessage from './CodeBlockMessage/CodeBlockMessage';
21
21
  import TextMessage from './TextMessage/TextMessage';
@@ -25,8 +25,31 @@ import SourcesCard from '../SourcesCard';
25
25
  import ListItemMessage from './ListMessage/ListItemMessage';
26
26
  import UnorderedListMessage from './ListMessage/UnorderedListMessage';
27
27
  import OrderedListMessage from './ListMessage/OrderedListMessage';
28
- export const Message = (_a) => {
29
- var { role, content, name, avatar, timestamp, isLoading, actions, sources, botWord = 'AI', loadingWord = 'Loading message', codeBlockProps, quickResponses, quickResponseContainerProps = { numLabels: 5 }, attachments, hasRoundAvatar = true, avatarProps } = _a, props = __rest(_a, ["role", "content", "name", "avatar", "timestamp", "isLoading", "actions", "sources", "botWord", "loadingWord", "codeBlockProps", "quickResponses", "quickResponseContainerProps", "attachments", "hasRoundAvatar", "avatarProps"]);
28
+ import QuickStartTile from './QuickStarts/QuickStartTile';
29
+ import QuickResponse from './QuickResponse/QuickResponse';
30
+ import UserFeedback from './UserFeedback/UserFeedback';
31
+ import UserFeedbackComplete from './UserFeedback/UserFeedbackComplete';
32
+ import TableMessage from './TableMessage/TableMessage';
33
+ import TrMessage from './TableMessage/TrMessage';
34
+ import TdMessage from './TableMessage/TdMessage';
35
+ import TbodyMessage from './TableMessage/TbodyMessage';
36
+ import TheadMessage from './TableMessage/TheadMessage';
37
+ import ThMessage from './TableMessage/ThMessage';
38
+ import ImageMessage from './ImageMessage/ImageMessage';
39
+ import rehypeUnwrapImages from 'rehype-unwrap-images';
40
+ import rehypeExternalLinks from 'rehype-external-links';
41
+ import rehypeSanitize from 'rehype-sanitize';
42
+ import LinkMessage from './LinkMessage/LinkMessage';
43
+ export const MessageBase = (_a) => {
44
+ 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 = [] } = _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"]);
45
+ const { beforeMainContent, afterMainContent, endContent } = extraContent || {};
46
+ let rehypePlugins = [rehypeUnwrapImages];
47
+ if (openLinkInNewTab) {
48
+ rehypePlugins = rehypePlugins.concat([[rehypeExternalLinks, { target: '_blank' }, rehypeSanitize]]);
49
+ }
50
+ if (additionalRehypePlugins) {
51
+ rehypePlugins.push(...additionalRehypePlugins);
52
+ }
30
53
  let avatarClassName;
31
54
  if (avatarProps && 'className' in avatarProps) {
32
55
  const { className } = avatarProps, rest = __rest(avatarProps, ["className"]);
@@ -36,7 +59,7 @@ export const Message = (_a) => {
36
59
  // Keep timestamps consistent between Timestamp component and aria-label
37
60
  const date = new Date();
38
61
  const dateString = timestamp !== null && timestamp !== void 0 ? timestamp : `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
39
- return (React.createElement("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}` }, props),
62
+ return (React.createElement("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),
40
63
  React.createElement(Avatar, Object.assign({ className: `pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`, src: avatar, alt: "" }, avatarProps)),
41
64
  React.createElement("div", { className: "pf-chatbot__message-contents" },
42
65
  React.createElement("div", { className: "pf-chatbot__message-meta" },
@@ -46,23 +69,51 @@ export const Message = (_a) => {
46
69
  React.createElement(Timestamp, { date: date }, timestamp)),
47
70
  React.createElement("div", { className: "pf-chatbot__message-response" },
48
71
  React.createElement("div", { className: "pf-chatbot__message-and-actions" },
49
- isLoading ? (React.createElement(MessageLoading, { loadingWord: loadingWord })) : (React.createElement(Markdown, { components: {
50
- p: TextMessage,
51
- code: ({ children }) => React.createElement(CodeBlockMessage, Object.assign({}, codeBlockProps), children),
52
- ul: UnorderedListMessage,
53
- ol: OrderedListMessage,
54
- li: ListItemMessage
55
- }, remarkPlugins: [remarkGfm] }, content)),
72
+ isLoading ? (React.createElement(MessageLoading, { loadingWord: loadingWord })) : (React.createElement(React.Fragment, null,
73
+ beforeMainContent && React.createElement(React.Fragment, null, beforeMainContent),
74
+ React.createElement(Markdown, { components: {
75
+ p: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.p }, props)),
76
+ code: (_a) => {
77
+ var { children } = _a, props = __rest(_a, ["children"]);
78
+ return (React.createElement(CodeBlockMessage, Object.assign({}, props, codeBlockProps), children));
79
+ },
80
+ h1: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h1 }, props)),
81
+ h2: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h2 }, props)),
82
+ h3: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h3 }, props)),
83
+ h4: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h4 }, props)),
84
+ h5: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h5 }, props)),
85
+ h6: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h6 }, props)),
86
+ blockquote: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.blockquote }, props)),
87
+ ul: (props) => React.createElement(UnorderedListMessage, Object.assign({}, props)),
88
+ ol: (props) => React.createElement(OrderedListMessage, Object.assign({}, props)),
89
+ li: (props) => React.createElement(ListItemMessage, Object.assign({}, props)),
90
+ table: (props) => React.createElement(TableMessage, Object.assign({}, props, tableProps)),
91
+ tbody: (props) => React.createElement(TbodyMessage, Object.assign({}, props)),
92
+ thead: (props) => React.createElement(TheadMessage, Object.assign({}, props)),
93
+ tr: (props) => React.createElement(TrMessage, Object.assign({}, props)),
94
+ td: (props) => {
95
+ // Conflicts with Td type
96
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
97
+ const { width } = props, rest = __rest(props, ["width"]);
98
+ return React.createElement(TdMessage, Object.assign({}, rest));
99
+ },
100
+ th: (props) => React.createElement(ThMessage, Object.assign({}, props)),
101
+ img: (props) => React.createElement(ImageMessage, Object.assign({}, props)),
102
+ a: (props) => (React.createElement(LinkMessage, { href: props.href, rel: props.rel, target: props.target }, props.children))
103
+ }, remarkPlugins: [remarkGfm], rehypePlugins: rehypePlugins }, content),
104
+ afterMainContent && React.createElement(React.Fragment, null, afterMainContent))),
56
105
  !isLoading && sources && React.createElement(SourcesCard, Object.assign({}, sources)),
106
+ quickStarts && quickStarts.quickStart && (React.createElement(QuickStartTile, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel })),
57
107
  !isLoading && actions && React.createElement(ResponseActions, { actions: actions }),
58
- !isLoading && quickResponses && (React.createElement(LabelGroup, Object.assign({ className: `pf-chatbot__message-quick-response ${quickResponseContainerProps === null || quickResponseContainerProps === void 0 ? void 0 : quickResponseContainerProps.className}` }, quickResponseContainerProps), quickResponses.map((_a) => {
59
- var { id, onClick, content } = _a, props = __rest(_a, ["id", "onClick", "content"]);
60
- return (React.createElement(Label, Object.assign({ variant: "outline", color: "blue", key: id, onClick: onClick }, props), content));
61
- })))),
108
+ userFeedbackForm && React.createElement(UserFeedback, Object.assign({}, userFeedbackForm, { timestamp: dateString })),
109
+ userFeedbackComplete && React.createElement(UserFeedbackComplete, Object.assign({}, userFeedbackComplete, { timestamp: dateString })),
110
+ !isLoading && quickResponses && (React.createElement(QuickResponse, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps }))),
62
111
  attachments && (React.createElement("div", { className: "pf-chatbot__message-attachments-container" }, attachments.map((attachment) => {
63
112
  var _a;
64
113
  return (React.createElement("div", { key: (_a = attachment.id) !== null && _a !== void 0 ? _a : attachment.name, className: "pf-chatbot__message-attachment" },
65
114
  React.createElement(FileDetailsLabel, { fileName: attachment.name, fileId: attachment.id, onClose: attachment.onClose, onClick: attachment.onClick, isLoading: attachment.isLoading, closeButtonAriaLabel: attachment.closeButtonAriaLabel, languageTestId: attachment.languageTestId, spinnerTestId: attachment.spinnerTestId })));
66
- })))))));
115
+ }))),
116
+ !isLoading && endContent && React.createElement(React.Fragment, null, endContent)))));
67
117
  };
118
+ const Message = React.forwardRef((props, ref) => (React.createElement(MessageBase, Object.assign({ innerRef: ref }, props))));
68
119
  export default Message;
@@ -12,6 +12,9 @@ import { render, screen } from '@testing-library/react';
12
12
  import '@testing-library/jest-dom';
13
13
  import Message from './Message';
14
14
  import userEvent from '@testing-library/user-event';
15
+ import { monitorSampleAppQuickStart } from './QuickStarts/monitor-sampleapp-quickstart';
16
+ import { monitorSampleAppQuickStartWithImage } from './QuickStarts/monitor-sampleapp-quickstart-with-image';
17
+ import rehypeExternalLinks from '../__mocks__/rehype-external-links';
15
18
  const ALL_ACTIONS = [
16
19
  { label: /Good response/i },
17
20
  { label: /Bad response/i },
@@ -55,6 +58,82 @@ spec:
55
58
  url: https://raw.githubusercontent.com/Azure-Samples/helm-charts/master/docs
56
59
  `;
57
60
  const INLINE_CODE = `Here is an inline code - \`() => void\``;
61
+ const ORDERED_LIST_WITH_CODE = `
62
+ 1. Item 1
63
+ 2. Item 2
64
+
65
+ \`\`\`yaml
66
+ - name: Hello World Playbook
67
+ hosts: localhost
68
+ tasks:
69
+ - name: Print Hello World
70
+ ansible.builtin.debug:
71
+ msg: "Hello, World!"
72
+ \`\`\`
73
+
74
+ 3. Item 3
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
+ const BLOCK_QUOTES = `> Blockquotes can also be nested...
90
+ >> ...by using additional greater-than signs (>) right next to each other...
91
+ > > > ...or with spaces between each sign.`;
92
+ const TABLE = `
93
+
94
+ | Column 1 | Column 2 |
95
+ |-|-|
96
+ | Cell 1 | Cell 2 |
97
+ | Cell 3 | Cell 4 |
98
+
99
+ `;
100
+ const ONE_COLUMN_TABLE = `
101
+
102
+ | Column 1 |
103
+ |-|
104
+ | Cell 1 |
105
+ | Cell 2 |
106
+
107
+ `;
108
+ const ONE_CELL_TABLE = `
109
+
110
+ | Column 1 |
111
+ |-|
112
+ | Cell 1 |
113
+
114
+ `;
115
+ const HEADERLESS_TABLE = `
116
+
117
+ | |
118
+ |-|
119
+ | Cell 1 |
120
+
121
+ `;
122
+ const CHILDLESS_TABLE = `
123
+
124
+ | Column 1 |
125
+ |-|
126
+ | |
127
+
128
+ `;
129
+ const EMPTY_TABLE = `
130
+
131
+ | |
132
+ |-|
133
+ | |
134
+
135
+ `;
136
+ const IMAGE = `![Multi-colored wavy lines on a black background](https://cdn.dribbble.com/userupload/10651749/file/original-8a07b8e39d9e8bf002358c66fce1223e.gif)`;
58
137
  const checkListItemsRendered = () => {
59
138
  const items = ['Item 1', 'Item 2', 'Item 3'];
60
139
  expect(screen.getAllByRole('listitem')).toHaveLength(3);
@@ -64,6 +143,9 @@ const checkListItemsRendered = () => {
64
143
  });
65
144
  };
66
145
  describe('Message', () => {
146
+ beforeEach(() => {
147
+ jest.clearAllMocks();
148
+ });
67
149
  it('should render user messages correctly', () => {
68
150
  render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi" }));
69
151
  expect(screen.getByText('User')).toBeTruthy();
@@ -275,6 +357,12 @@ describe('Message', () => {
275
357
  expect(screen.getByText('Here is an ordered list:')).toBeTruthy();
276
358
  checkListItemsRendered();
277
359
  });
360
+ it('should render ordered lists correctly if there is interstitial content', () => {
361
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: ORDERED_LIST_WITH_CODE }));
362
+ checkListItemsRendered();
363
+ const list = screen.getAllByRole('list')[1];
364
+ expect(list).toHaveAttribute('start', '3');
365
+ });
278
366
  it('should render inline code', () => {
279
367
  render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: INLINE_CODE }));
280
368
  expect(screen.getByText(/() => void/i)).toBeTruthy();
@@ -284,12 +372,16 @@ describe('Message', () => {
284
372
  render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: CODE_MESSAGE }));
285
373
  expect(screen.getByText('Here is some YAML code:')).toBeTruthy();
286
374
  expect(screen.getByRole('button', { name: 'Copy code button' })).toBeTruthy();
287
- expect(screen.getByText(/apiVersion: helm.openshift.io\/v1beta1/i)).toBeTruthy();
375
+ expect(screen.getByText(/yaml/)).toBeTruthy();
376
+ expect(screen.getByText(/apiVersion:/i)).toBeTruthy();
377
+ expect(screen.getByText(/helm.openshift.io\/v1beta1/i)).toBeTruthy();
288
378
  expect(screen.getByText(/metadata:/i)).toBeTruthy();
289
- expect(screen.getByText(/name: azure-sample-repo0oooo00ooo/i)).toBeTruthy();
379
+ expect(screen.getByText(/name:/i)).toBeTruthy();
380
+ expect(screen.getByText(/azure-sample-repo0oooo00ooo/i)).toBeTruthy();
290
381
  expect(screen.getByText(/spec/i)).toBeTruthy();
291
382
  expect(screen.getByText(/connectionConfig:/i)).toBeTruthy();
292
- expect(screen.getByText(/url: https:\/\/raw.githubusercontent.com\/Azure-Samples\/helm-charts\/master\/docs/i)).toBeTruthy();
383
+ expect(screen.getByText(/url:/i)).toBeTruthy();
384
+ expect(screen.getByText(/https:\/\/raw.githubusercontent.com\/Azure-Samples\/helm-charts\/master\/docs/i)).toBeTruthy();
293
385
  });
294
386
  it('can click copy code button', () => __awaiter(void 0, void 0, void 0, function* () {
295
387
  // need explicit setup since RTL stubs clipboard if you do this
@@ -327,4 +419,174 @@ describe('Message', () => {
327
419
  expect(screen.getByRole('img')).toHaveClass('test');
328
420
  expect(screen.getByRole('img')).toHaveClass('pf-chatbot__message-avatar');
329
421
  });
422
+ it('should handle QuickStart tile correctly', () => {
423
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi", quickStarts: {
424
+ quickStart: monitorSampleAppQuickStart,
425
+ onSelectQuickStart: (id) => alert(id)
426
+ } }));
427
+ expect(screen.getByRole('button', { name: 'Monitoring your sample application' })).toBeTruthy();
428
+ expect(screen.getByRole('heading', { name: '1 Prerequisite' })).toBeTruthy();
429
+ expect(screen.getByRole('button', { name: 'Show prerequisites' })).toBeTruthy();
430
+ expect(screen.getByRole('button', { name: 'Start' })).toBeTruthy();
431
+ });
432
+ it('should handle click on QuickStart tile correctly', () => __awaiter(void 0, void 0, void 0, function* () {
433
+ const spy = jest.fn();
434
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi", quickStarts: {
435
+ quickStart: monitorSampleAppQuickStart,
436
+ onSelectQuickStart: (id) => spy(id)
437
+ } }));
438
+ yield userEvent.click(screen.getByRole('button', { name: 'Monitoring your sample application' }));
439
+ expect(spy).toHaveBeenCalledTimes(1);
440
+ expect(spy).toHaveBeenCalledWith(monitorSampleAppQuickStart.metadata.name);
441
+ }));
442
+ it('should handle QuickStart tile with image correctly', () => __awaiter(void 0, void 0, void 0, function* () {
443
+ const spy = jest.fn();
444
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi", quickStarts: {
445
+ quickStart: monitorSampleAppQuickStartWithImage,
446
+ onSelectQuickStart: (id) => spy(id)
447
+ } }));
448
+ expect(screen.getAllByRole('img')[1]).toHaveAttribute('src', 'test.png');
449
+ }));
450
+ it('should handle block quote correctly', () => {
451
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: BLOCK_QUOTES }));
452
+ expect(screen.getByText(/Blockquotes can also be nested.../)).toBeTruthy();
453
+ expect(screen.getByText('...by using additional greater-than signs (>) right next to each other...')).toBeTruthy();
454
+ expect(screen.getByText(/...or with spaces between each sign./)).toBeTruthy();
455
+ });
456
+ it('should handle heading correctly', () => {
457
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: HEADING }));
458
+ expect(screen.getByRole('heading', { name: /h1 Heading/i })).toBeTruthy();
459
+ expect(screen.getByRole('heading', { name: /h2 Heading/i })).toBeTruthy();
460
+ expect(screen.getByRole('heading', { name: /h3 Heading/i })).toBeTruthy();
461
+ expect(screen.getByRole('heading', { name: /h4 Heading/i })).toBeTruthy();
462
+ expect(screen.getByRole('heading', { name: /h5 Heading/i })).toBeTruthy();
463
+ expect(screen.getByRole('heading', { name: /h6 Heading/i })).toBeTruthy();
464
+ });
465
+ it('should render table correctly', () => {
466
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: TABLE }));
467
+ expect(screen.getByRole('row', { name: /Column 1 Column 2/i })).toBeTruthy();
468
+ expect(screen.getByRole('row', { name: /Cell 1 Cell 2/i })).toBeTruthy();
469
+ expect(screen.getByRole('row', { name: /Cell 3 Cell 4/i })).toBeTruthy();
470
+ expect(screen.getByRole('columnheader', { name: /Column 1/i })).toBeTruthy();
471
+ expect(screen.getByRole('columnheader', { name: /Column 2/i })).toBeTruthy();
472
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toBeTruthy();
473
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toBeTruthy();
474
+ expect(screen.getByRole('cell', { name: /Cell 3/i })).toBeTruthy();
475
+ expect(screen.getByRole('cell', { name: /Cell 4/i })).toBeTruthy();
476
+ });
477
+ it('should render table data labels correctly for mobile breakpoint', () => {
478
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: TABLE }));
479
+ expect(screen.getByRole('row', { name: /Cell 1 Cell 2/i })).toHaveAttribute('extraHeaders', 'Column 1,Column 2');
480
+ expect(screen.getByRole('row', { name: /Cell 3 Cell 4/i })).toHaveAttribute('extraHeaders', 'Column 1,Column 2');
481
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
482
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toHaveAttribute('data-label', 'Column 2');
483
+ expect(screen.getByRole('cell', { name: /Cell 3/i })).toHaveAttribute('data-label', 'Column 1');
484
+ expect(screen.getByRole('cell', { name: /Cell 4/i })).toHaveAttribute('data-label', 'Column 2');
485
+ });
486
+ it('should render table data labels correctly for mobile breakpoint for one column table', () => {
487
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: ONE_COLUMN_TABLE }));
488
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', 'Column 1');
489
+ expect(screen.getByRole('row', { name: /Cell 2/i })).toHaveAttribute('extraHeaders', 'Column 1');
490
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
491
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toHaveAttribute('data-label', 'Column 1');
492
+ });
493
+ it('should render table data labels correctly for mobile breakpoint for one cell table', () => {
494
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: ONE_CELL_TABLE }));
495
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', 'Column 1');
496
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
497
+ });
498
+ it('should render table data labels correctly for mobile breakpoint for headerless', () => {
499
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: HEADERLESS_TABLE }));
500
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', '');
501
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).not.toHaveAttribute('data-label');
502
+ });
503
+ it('should render table data labels correctly for mobile breakpoint for childless', () => {
504
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: CHILDLESS_TABLE }));
505
+ expect(screen.getByRole('cell')).not.toHaveAttribute('extraHeaders', 'Column 1');
506
+ });
507
+ it('should render table data labels correctly for mobile breakpoint for empty', () => {
508
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: EMPTY_TABLE }));
509
+ expect(screen.getByRole('cell')).not.toHaveAttribute('extraHeaders', '');
510
+ });
511
+ it('should render custom table aria label correctly', () => {
512
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: TABLE, tableProps: { 'aria-label': 'Test' } }));
513
+ expect(screen.getByRole('grid', { name: /Test/i })).toBeTruthy();
514
+ });
515
+ it('should render beforeMainContent with main content', () => {
516
+ const mainContent = 'Main message content';
517
+ const beforeMainContentText = 'Before main content';
518
+ const beforeMainContent = React.createElement("div", null, beforeMainContentText);
519
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: mainContent, extraContent: { beforeMainContent } }));
520
+ expect(screen.getByText(beforeMainContentText)).toBeTruthy();
521
+ expect(screen.getByText(mainContent)).toBeTruthy();
522
+ });
523
+ it('should render afterMainContent with main content', () => {
524
+ const mainContent = 'Main message content';
525
+ const afterMainContentText = 'After main content';
526
+ const afterMainContent = React.createElement("div", null, afterMainContentText);
527
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: mainContent, extraContent: { afterMainContent } }));
528
+ expect(screen.getByText(afterMainContentText)).toBeTruthy();
529
+ expect(screen.getByText(mainContent)).toBeTruthy();
530
+ });
531
+ it('should render endContent with main content', () => {
532
+ const mainContent = 'Main message content';
533
+ const endMainContentText = 'End content';
534
+ const endContent = React.createElement("div", null, endMainContentText);
535
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: mainContent, extraContent: { endContent } }));
536
+ expect(screen.getByText(endMainContentText)).toBeTruthy();
537
+ expect(screen.getByText(mainContent)).toBeTruthy();
538
+ });
539
+ it('should render all parts of extraContent with main content', () => {
540
+ const beforeMainContent = React.createElement("div", null, "Before main content");
541
+ const afterMainContent = React.createElement("div", null, "After main content");
542
+ const endContent = React.createElement("div", null, "End content");
543
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content", extraContent: { beforeMainContent, afterMainContent, endContent } }));
544
+ expect(screen.getByText('Before main content')).toBeTruthy();
545
+ expect(screen.getByText('Main message content')).toBeTruthy();
546
+ expect(screen.getByText('After main content')).toBeTruthy();
547
+ expect(screen.getByText('End content')).toBeTruthy();
548
+ });
549
+ it('should not render extraContent when not provided', () => {
550
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content" }));
551
+ // Ensure no extraContent is rendered
552
+ expect(screen.getByText('Main message content')).toBeTruthy();
553
+ expect(screen.queryByText('Before main content')).toBeFalsy();
554
+ expect(screen.queryByText('After main content')).toBeFalsy();
555
+ expect(screen.queryByText('end message content')).toBeFalsy();
556
+ });
557
+ it('should handle undefined or null values in extraContent gracefully', () => {
558
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content", extraContent: { beforeMainContent: null, afterMainContent: undefined, endContent: null } }));
559
+ // Ensure that no extraContent is rendered if they are null or undefined
560
+ expect(screen.getByText('Main message content')).toBeTruthy();
561
+ expect(screen.queryByText('Before main content')).toBeFalsy();
562
+ expect(screen.queryByText('After main content')).toBeFalsy();
563
+ expect(screen.queryByText('end message content')).toBeFalsy();
564
+ });
565
+ it('should render JSX in extraContent correctly', () => {
566
+ const beforeMainContent = (React.createElement("div", { "data-testid": "before-main-content" },
567
+ React.createElement("strong", null, "Bold before content")));
568
+ const afterMainContent = (React.createElement("div", { "data-testid": "after-main-content" },
569
+ React.createElement("strong", null, "Bold after content")));
570
+ const endContent = (React.createElement("div", { "data-testid": "end-main-content" },
571
+ React.createElement("strong", null, "Bold end content")));
572
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content", extraContent: { beforeMainContent, afterMainContent, endContent } }));
573
+ // Check that the JSX is correctly rendered
574
+ expect(screen.getByTestId('before-main-content')).toContainHTML('<strong>Bold before content</strong>');
575
+ expect(screen.getByTestId('after-main-content')).toContainHTML('<strong>Bold after content</strong>');
576
+ expect(screen.getByTestId('end-main-content')).toContainHTML('<strong>Bold end content</strong>');
577
+ });
578
+ it('should handle image correctly', () => {
579
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: IMAGE }));
580
+ expect(screen.getByRole('img', { name: /Multi-colored wavy lines on a black background/i })).toBeTruthy();
581
+ });
582
+ it('should handle external links correctly', () => {
583
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: `[PatternFly](https://www.patternfly.org/)` }));
584
+ // we are mocking rehype libraries, so we can't test target _blank addition on links directly with RTL
585
+ expect(rehypeExternalLinks).toHaveBeenCalledTimes(1);
586
+ });
587
+ it('should handle external links correctly', () => {
588
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: `[PatternFly](https://www.patternfly.org/)`, openLinkInNewTab: false }));
589
+ // we are mocking rehype libraries, so we can't test target _blank addition on links directly with RTL
590
+ expect(rehypeExternalLinks).not.toHaveBeenCalled();
591
+ });
330
592
  });
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { LabelGroupProps, LabelProps } from '@patternfly/react-core';
3
+ export interface QuickResponse extends Omit<LabelProps, 'children'> {
4
+ content: string;
5
+ id: string;
6
+ onClick?: () => void;
7
+ }
8
+ export interface QuickResponseProps {
9
+ /** Props for quick responses */
10
+ quickResponses: QuickResponse[];
11
+ /** Props for quick responses container */
12
+ quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
13
+ /** Callback when a response is clicked; used in feedback cards */
14
+ onSelect?: (id: string) => void;
15
+ }
16
+ export declare const QuickResponse: React.FunctionComponent<QuickResponseProps>;
17
+ export default QuickResponse;