@patternfly/chatbot 2.2.0-prerelease.2 → 2.2.0-prerelease.20

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 (370) 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.js +3 -1
  10. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +17 -1
  11. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -9
  12. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +39 -3
  13. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  14. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +18 -0
  15. package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  16. package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.js +87 -0
  17. package/dist/cjs/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  18. package/dist/cjs/ChatbotHeader/ChatbotHeader.test.js +18 -0
  19. package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  20. package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.js +18 -0
  21. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +17 -0
  22. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +16 -0
  23. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  24. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.js +20 -0
  25. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  26. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.js +18 -0
  27. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.d.ts +2 -0
  28. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +4 -2
  29. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
  30. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +20 -0
  31. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
  32. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
  33. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +43 -0
  34. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +3 -1
  35. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
  36. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +41 -0
  37. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
  38. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.js +47 -0
  39. package/dist/cjs/ChatbotHeader/index.d.ts +1 -0
  40. package/dist/cjs/ChatbotHeader/index.js +1 -0
  41. package/dist/cjs/ChatbotToggle/ChatbotToggle.js +3 -1
  42. package/dist/cjs/CodeModal/CodeModal.js +2 -12
  43. package/dist/cjs/Compare/Compare.d.ts +17 -0
  44. package/dist/cjs/Compare/Compare.js +50 -0
  45. package/dist/cjs/Compare/Compare.test.d.ts +1 -0
  46. package/dist/cjs/Compare/Compare.test.js +20 -0
  47. package/dist/cjs/Compare/index.d.ts +2 -0
  48. package/dist/cjs/Compare/index.js +23 -0
  49. package/dist/cjs/Message/ListMessage/OrderedListMessage.d.ts +1 -1
  50. package/dist/cjs/Message/ListMessage/OrderedListMessage.js +2 -2
  51. package/dist/cjs/Message/Message.d.ts +28 -7
  52. package/dist/cjs/Message/Message.js +29 -14
  53. package/dist/cjs/Message/Message.test.js +89 -3
  54. package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +17 -0
  55. package/dist/cjs/Message/QuickResponse/QuickResponse.js +34 -0
  56. package/dist/cjs/Message/QuickStarts/FallbackImg.d.ts +13 -0
  57. package/dist/cjs/Message/QuickStarts/FallbackImg.js +34 -0
  58. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  59. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +82 -0
  60. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  61. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.js +64 -0
  62. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  63. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.js +76 -0
  64. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  65. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.js +30 -0
  66. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  67. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +77 -0
  68. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  69. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.js +77 -0
  70. package/dist/cjs/Message/QuickStarts/types.d.ts +132 -0
  71. package/dist/cjs/Message/QuickStarts/types.js +17 -0
  72. package/dist/cjs/Message/TextMessage/TextMessage.d.ts +2 -1
  73. package/dist/cjs/Message/TextMessage/TextMessage.js +2 -2
  74. package/dist/cjs/Message/UserFeedback/CloseButton.d.ts +10 -0
  75. package/dist/cjs/Message/UserFeedback/CloseButton.js +14 -0
  76. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +39 -0
  77. package/dist/cjs/Message/UserFeedback/UserFeedback.js +55 -0
  78. package/dist/cjs/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  79. package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +146 -0
  80. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  81. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +117 -0
  82. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  83. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +249 -0
  84. package/dist/cjs/MessageBar/AttachButton.js +4 -2
  85. package/dist/cjs/MessageBar/MessageBar.js +9 -12
  86. package/dist/cjs/MessageBar/MessageBar.test.js +4 -4
  87. package/dist/cjs/MessageBar/SendButton.js +3 -1
  88. package/dist/cjs/MessageBar/StopButton.js +3 -1
  89. package/dist/cjs/MessageBox/MessageBox.test.d.ts +1 -0
  90. package/dist/cjs/MessageBox/MessageBox.test.js +22 -0
  91. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  92. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.js +28 -0
  93. package/dist/cjs/ResponseActions/ResponseActionButton.d.ts +10 -1
  94. package/dist/cjs/ResponseActions/ResponseActionButton.js +28 -5
  95. package/dist/cjs/ResponseActions/ResponseActionButton.test.d.ts +1 -0
  96. package/dist/cjs/ResponseActions/ResponseActionButton.test.js +54 -0
  97. package/dist/cjs/ResponseActions/ResponseActions.d.ts +12 -2
  98. package/dist/cjs/ResponseActions/ResponseActions.js +26 -9
  99. package/dist/cjs/ResponseActions/ResponseActions.test.js +79 -5
  100. package/dist/cjs/Settings/SettingsForm.d.ts +13 -0
  101. package/dist/cjs/Settings/SettingsForm.js +27 -0
  102. package/dist/cjs/Settings/SettingsForm.test.d.ts +1 -0
  103. package/dist/cjs/Settings/SettingsForm.test.js +26 -0
  104. package/dist/cjs/Settings/index.d.ts +2 -0
  105. package/dist/cjs/Settings/index.js +23 -0
  106. package/dist/cjs/TermsOfUse/TermsOfUse.d.ts +34 -0
  107. package/dist/cjs/TermsOfUse/TermsOfUse.js +49 -0
  108. package/dist/cjs/TermsOfUse/TermsOfUse.test.d.ts +1 -0
  109. package/dist/cjs/TermsOfUse/TermsOfUse.test.js +79 -0
  110. package/dist/cjs/TermsOfUse/index.d.ts +2 -0
  111. package/dist/cjs/TermsOfUse/index.js +23 -0
  112. package/dist/cjs/index.d.ts +6 -0
  113. package/dist/cjs/index.js +10 -1
  114. package/dist/css/main.css +372 -102
  115. package/dist/css/main.css.map +1 -1
  116. package/dist/dynamic/Compare/package.json +1 -0
  117. package/dist/dynamic/Settings/package.json +1 -0
  118. package/dist/dynamic/TermsOfUse/package.json +1 -0
  119. package/dist/esm/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
  120. package/dist/esm/AttachmentEdit/AttachmentEdit.test.js +47 -0
  121. package/dist/esm/Chatbot/Chatbot.test.d.ts +1 -0
  122. package/dist/esm/Chatbot/Chatbot.test.js +23 -0
  123. package/dist/esm/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
  124. package/dist/esm/ChatbotAlert/ChatbotAlert.test.js +22 -0
  125. package/dist/esm/ChatbotContent/ChatbotContent.test.d.ts +1 -0
  126. package/dist/esm/ChatbotContent/ChatbotContent.test.js +13 -0
  127. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
  128. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +17 -1
  129. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -9
  130. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +39 -3
  131. package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  132. package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +13 -0
  133. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  134. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.js +82 -0
  135. package/dist/esm/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  136. package/dist/esm/ChatbotHeader/ChatbotHeader.test.js +13 -0
  137. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  138. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.js +13 -0
  139. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +17 -0
  140. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +10 -0
  141. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  142. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +15 -0
  143. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  144. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.js +13 -0
  145. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.d.ts +2 -0
  146. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +4 -2
  147. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
  148. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +15 -0
  149. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
  150. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
  151. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +38 -0
  152. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +3 -1
  153. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
  154. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +36 -0
  155. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
  156. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.js +42 -0
  157. package/dist/esm/ChatbotHeader/index.d.ts +1 -0
  158. package/dist/esm/ChatbotHeader/index.js +1 -0
  159. package/dist/esm/ChatbotToggle/ChatbotToggle.js +3 -1
  160. package/dist/esm/CodeModal/CodeModal.js +2 -12
  161. package/dist/esm/Compare/Compare.d.ts +17 -0
  162. package/dist/esm/Compare/Compare.js +43 -0
  163. package/dist/esm/Compare/Compare.test.d.ts +1 -0
  164. package/dist/esm/Compare/Compare.test.js +15 -0
  165. package/dist/esm/Compare/index.d.ts +2 -0
  166. package/dist/esm/Compare/index.js +2 -0
  167. package/dist/esm/Message/ListMessage/OrderedListMessage.d.ts +1 -1
  168. package/dist/esm/Message/ListMessage/OrderedListMessage.js +2 -2
  169. package/dist/esm/Message/Message.d.ts +28 -7
  170. package/dist/esm/Message/Message.js +27 -12
  171. package/dist/esm/Message/Message.test.js +89 -3
  172. package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +17 -0
  173. package/dist/esm/Message/QuickResponse/QuickResponse.js +27 -0
  174. package/dist/esm/Message/QuickStarts/FallbackImg.d.ts +13 -0
  175. package/dist/esm/Message/QuickStarts/FallbackImg.js +9 -0
  176. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  177. package/dist/esm/Message/QuickStarts/QuickStartTile.js +52 -0
  178. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  179. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.js +35 -0
  180. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  181. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.js +48 -0
  182. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  183. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.js +5 -0
  184. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  185. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +74 -0
  186. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  187. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.js +74 -0
  188. package/dist/esm/Message/QuickStarts/types.d.ts +132 -0
  189. package/dist/esm/Message/QuickStarts/types.js +14 -0
  190. package/dist/esm/Message/TextMessage/TextMessage.d.ts +2 -1
  191. package/dist/esm/Message/TextMessage/TextMessage.js +3 -3
  192. package/dist/esm/Message/UserFeedback/CloseButton.d.ts +10 -0
  193. package/dist/esm/Message/UserFeedback/CloseButton.js +9 -0
  194. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +39 -0
  195. package/dist/esm/Message/UserFeedback/UserFeedback.js +50 -0
  196. package/dist/esm/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  197. package/dist/esm/Message/UserFeedback/UserFeedback.test.js +141 -0
  198. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  199. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +112 -0
  200. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  201. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +244 -0
  202. package/dist/esm/MessageBar/AttachButton.js +4 -2
  203. package/dist/esm/MessageBar/MessageBar.js +9 -12
  204. package/dist/esm/MessageBar/MessageBar.test.js +4 -4
  205. package/dist/esm/MessageBar/SendButton.js +3 -1
  206. package/dist/esm/MessageBar/StopButton.js +3 -1
  207. package/dist/esm/MessageBox/MessageBox.test.d.ts +1 -0
  208. package/dist/esm/MessageBox/MessageBox.test.js +17 -0
  209. package/dist/esm/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  210. package/dist/esm/PreviewAttachment/PreviewAttachment.test.js +23 -0
  211. package/dist/esm/ResponseActions/ResponseActionButton.d.ts +10 -1
  212. package/dist/esm/ResponseActions/ResponseActionButton.js +25 -2
  213. package/dist/esm/ResponseActions/ResponseActionButton.test.d.ts +1 -0
  214. package/dist/esm/ResponseActions/ResponseActionButton.test.js +49 -0
  215. package/dist/esm/ResponseActions/ResponseActions.d.ts +12 -2
  216. package/dist/esm/ResponseActions/ResponseActions.js +26 -9
  217. package/dist/esm/ResponseActions/ResponseActions.test.js +79 -5
  218. package/dist/esm/Settings/SettingsForm.d.ts +13 -0
  219. package/dist/esm/Settings/SettingsForm.js +20 -0
  220. package/dist/esm/Settings/SettingsForm.test.d.ts +1 -0
  221. package/dist/esm/Settings/SettingsForm.test.js +21 -0
  222. package/dist/esm/Settings/index.d.ts +2 -0
  223. package/dist/esm/Settings/index.js +2 -0
  224. package/dist/esm/TermsOfUse/TermsOfUse.d.ts +34 -0
  225. package/dist/esm/TermsOfUse/TermsOfUse.js +42 -0
  226. package/dist/esm/TermsOfUse/TermsOfUse.test.d.ts +1 -0
  227. package/dist/esm/TermsOfUse/TermsOfUse.test.js +74 -0
  228. package/dist/esm/TermsOfUse/index.d.ts +2 -0
  229. package/dist/esm/TermsOfUse/index.js +2 -0
  230. package/dist/esm/index.d.ts +6 -0
  231. package/dist/esm/index.js +6 -0
  232. package/dist/tsconfig.tsbuildinfo +1 -1
  233. package/package.json +7 -13
  234. package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +5 -2
  235. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +41 -4
  236. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +142 -13
  237. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomResponseActions.tsx +4 -0
  238. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +71 -0
  239. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedbackTimeout.tsx +27 -0
  240. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +31 -0
  241. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +63 -11
  242. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +182 -12
  243. package/patternfly-docs/content/extensions/chatbot/examples/Messages/explore-pipeline-quickstart.ts +65 -0
  244. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFooter.tsx +1 -1
  245. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFootnote.tsx +2 -2
  246. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +2 -2
  247. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerNavigation.tsx +67 -0
  248. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +94 -0
  249. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarAttach.tsx +1 -1
  250. package/patternfly-docs/content/extensions/chatbot/examples/UI/PF-TermsAndConditionsHeader.svg +148 -0
  251. package/patternfly-docs/content/extensions/chatbot/examples/UI/Settings.tsx +289 -0
  252. package/patternfly-docs/content/extensions/chatbot/examples/UI/SquareChatbotToggle.tsx +1 -1
  253. package/patternfly-docs/content/extensions/chatbot/examples/UI/TermsOfUse.tsx +147 -0
  254. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +49 -6
  255. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +14 -0
  256. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +26 -3
  257. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +2 -2
  258. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +20 -19
  259. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +2 -2
  260. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +2 -2
  261. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +206 -0
  262. package/patternfly-docs/content/extensions/chatbot/examples/demos/Feedback.tsx +104 -0
  263. package/patternfly-docs/content/extensions/chatbot/img/attached-file.svg +24 -29
  264. package/patternfly-docs/content/extensions/chatbot/img/attachment-menu.svg +4 -4
  265. package/patternfly-docs/content/extensions/chatbot/img/attachment-unsent.svg +30 -57
  266. package/patternfly-docs/content/extensions/chatbot/img/chatbot-elements.svg +5 -5
  267. package/patternfly-docs/content/extensions/chatbot/img/chatbot-quickstarts-tile.svg +58 -0
  268. package/patternfly-docs/content/extensions/chatbot/img/chatbot-settings.svg +83 -0
  269. package/patternfly-docs/content/extensions/chatbot/img/conversation-history.svg +6 -29
  270. package/patternfly-docs/content/extensions/chatbot/img/docked.svg +68 -49
  271. package/patternfly-docs/content/extensions/chatbot/img/footnote.svg +1 -1
  272. package/patternfly-docs/content/extensions/chatbot/img/fullscreen.svg +25 -16
  273. package/patternfly-docs/content/extensions/chatbot/img/listening.svg +1 -1
  274. package/patternfly-docs/content/extensions/chatbot/img/message-bar-elements.svg +3 -3
  275. package/patternfly-docs/content/extensions/chatbot/img/message-elements.svg +85 -142
  276. package/patternfly-docs/content/extensions/chatbot/img/overlay.svg +52 -36
  277. package/patternfly-docs/content/extensions/chatbot/img/settings-menu.svg +122 -0
  278. package/patternfly-docs/content/extensions/chatbot/img/source-tile.svg +62 -0
  279. package/patternfly-docs/content/extensions/chatbot/img/toggle-customizations.svg +12 -0
  280. package/src/AttachMenu/AttachMenu.scss +1 -1
  281. package/src/AttachmentEdit/AttachmentEdit.test.tsx +55 -0
  282. package/src/Chatbot/Chatbot.test.tsx +31 -0
  283. package/src/ChatbotAlert/ChatbotAlert.test.tsx +31 -0
  284. package/src/ChatbotContent/ChatbotContent.test.tsx +15 -0
  285. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx +7 -1
  286. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +8 -1
  287. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +112 -3
  288. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +41 -8
  289. package/src/ChatbotFooter/ChatbotFooter.scss +2 -6
  290. package/src/ChatbotFooter/ChatbotFooter.test.tsx +15 -0
  291. package/src/ChatbotFooter/ChatbotFooternote.test.tsx +84 -0
  292. package/src/ChatbotHeader/ChatbotHeader.scss +2 -5
  293. package/src/ChatbotHeader/ChatbotHeader.test.tsx +15 -0
  294. package/src/ChatbotHeader/ChatbotHeaderActions.test.tsx +17 -0
  295. package/src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx +20 -0
  296. package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +57 -0
  297. package/src/ChatbotHeader/ChatbotHeaderMain.test.tsx +17 -0
  298. package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +19 -0
  299. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +11 -2
  300. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx +45 -0
  301. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx +8 -1
  302. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx +43 -0
  303. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx +8 -1
  304. package/src/ChatbotHeader/ChatbotHeaderTitle.test.tsx +59 -0
  305. package/src/ChatbotHeader/index.ts +1 -0
  306. package/src/ChatbotModal/ChatbotModal.scss +1 -1
  307. package/src/ChatbotToggle/ChatbotToggle.tsx +6 -1
  308. package/src/CodeModal/CodeModal.scss +9 -1
  309. package/src/CodeModal/CodeModal.tsx +2 -13
  310. package/src/Compare/Compare.scss +72 -0
  311. package/src/Compare/Compare.test.tsx +31 -0
  312. package/src/Compare/Compare.tsx +98 -0
  313. package/src/Compare/index.ts +2 -0
  314. package/src/FileDetails/FileDetails.scss +1 -1
  315. package/src/FileDropZone/__snapshots__/FileDropZone.test.tsx.snap +1 -1
  316. package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +4 -4
  317. package/src/Message/ListMessage/ListMessage.scss +5 -5
  318. package/src/Message/ListMessage/OrderedListMessage.tsx +2 -2
  319. package/src/Message/Message.scss +4 -26
  320. package/src/Message/Message.test.tsx +116 -3
  321. package/src/Message/Message.tsx +72 -22
  322. package/src/Message/MessageLoading.scss +2 -2
  323. package/src/Message/QuickResponse/QuickResponse.scss +33 -0
  324. package/src/Message/QuickResponse/QuickResponse.tsx +54 -0
  325. package/src/Message/QuickStarts/FallbackImg.tsx +24 -0
  326. package/src/Message/QuickStarts/QuickStartTile.scss +24 -0
  327. package/src/Message/QuickStarts/QuickStartTile.tsx +147 -0
  328. package/src/Message/QuickStarts/QuickStartTileDescription.test.tsx +57 -0
  329. package/src/Message/QuickStarts/QuickStartTileDescription.tsx +81 -0
  330. package/src/Message/QuickStarts/QuickStartTileHeader.tsx +21 -0
  331. package/src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts +75 -0
  332. package/src/Message/QuickStarts/monitor-sampleapp-quickstart.ts +75 -0
  333. package/src/Message/QuickStarts/types.ts +154 -0
  334. package/src/Message/TextMessage/TextMessage.scss +8 -11
  335. package/src/Message/TextMessage/TextMessage.tsx +3 -3
  336. package/src/Message/UserFeedback/CloseButton.tsx +21 -0
  337. package/src/Message/UserFeedback/UserFeedback.scss +53 -0
  338. package/src/Message/UserFeedback/UserFeedback.test.tsx +257 -0
  339. package/src/Message/UserFeedback/UserFeedback.tsx +132 -0
  340. package/src/Message/UserFeedback/UserFeedbackComplete.test.tsx +255 -0
  341. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +211 -0
  342. package/src/MessageBar/AttachButton.scss +19 -3
  343. package/src/MessageBar/AttachButton.tsx +3 -1
  344. package/src/MessageBar/MessageBar.scss +3 -2
  345. package/src/MessageBar/MessageBar.test.tsx +4 -4
  346. package/src/MessageBar/MessageBar.tsx +9 -12
  347. package/src/MessageBar/MicrophoneButton.scss +8 -8
  348. package/src/MessageBar/SendButton.tsx +2 -0
  349. package/src/MessageBar/StopButton.scss +17 -3
  350. package/src/MessageBar/StopButton.tsx +2 -0
  351. package/src/MessageBox/JumpButton.scss +6 -6
  352. package/src/MessageBox/MessageBox.test.tsx +26 -0
  353. package/src/PreviewAttachment/PreviewAttachment.test.tsx +51 -0
  354. package/src/ResponseActions/ResponseActionButton.test.tsx +52 -0
  355. package/src/ResponseActions/ResponseActionButton.tsx +59 -28
  356. package/src/ResponseActions/ResponseActions.scss +11 -9
  357. package/src/ResponseActions/ResponseActions.test.tsx +103 -5
  358. package/src/ResponseActions/ResponseActions.tsx +80 -9
  359. package/src/Settings/Settings.scss +34 -0
  360. package/src/Settings/SettingsForm.test.tsx +28 -0
  361. package/src/Settings/SettingsForm.tsx +25 -0
  362. package/src/Settings/index.ts +3 -0
  363. package/src/SourceDetailsMenuItem/SourceDetailsMenuItem.scss +1 -1
  364. package/src/SourcesCard/SourcesCard.scss +2 -2
  365. package/src/TermsOfUse/TermsOfUse.scss +66 -0
  366. package/src/TermsOfUse/TermsOfUse.test.tsx +138 -0
  367. package/src/TermsOfUse/TermsOfUse.tsx +117 -0
  368. package/src/TermsOfUse/index.ts +3 -0
  369. package/src/index.ts +9 -0
  370. package/src/main.scss +6 -4
@@ -32,6 +32,8 @@ export const StopButton: React.FunctionComponent<StopButtonProps> = ({
32
32
  exitDelay={tooltipProps?.exitDelay || 0}
33
33
  distance={tooltipProps?.distance || 8}
34
34
  animationDuration={tooltipProps?.animationDuration || 0}
35
+ // prevents VO announcements of both aria label and tooltip
36
+ aria="none"
35
37
  {...tooltipProps}
36
38
  >
37
39
  <Button
@@ -16,13 +16,13 @@
16
16
  background-color: var(--pf-t--global--background--color--primary--default) !important;
17
17
  border: 1px solid var(--pf-t--chatbot--border) !important;
18
18
  box-shadow: var(--pf-t--global--box-shadow--sm);
19
- color: var(--pf-t--chatbot--icon--fill) !important;
19
+ color: var(--pf-t--global--icon--color--subtle) !important;
20
20
  transform: translate3d(-50%, 0, 0) !important;
21
21
  transition:
22
- background-color var(--pf-t--chatbot--timing-function) var(--pf-t--global--motion--duration--sm),
23
- box-shadow var(--pf-t--chatbot--timing-function) var(--pf-t--global--motion--duration--sm),
24
- transform var(--pf-t--chatbot--timing-function) var(--pf-t--global--motion--duration--md),
25
- opacity var(--pf-t--chatbot--timing-function) var(--pf-t--global--motion--duration--md) !important;
22
+ background-color var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--sm),
23
+ box-shadow var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--sm),
24
+ transform var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--md),
25
+ opacity var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--md) !important;
26
26
  z-index: var(--pf-t--global--z-index--md) !important;
27
27
 
28
28
  .pf-v6-c-button__text {
@@ -33,7 +33,7 @@
33
33
  &:focus {
34
34
  background-color: var(--pf-t--global--background--color--primary--hover) !important;
35
35
  box-shadow: var(--pf-t--global--box-shadow--md) !important;
36
- color: var(--pf-t--chatbot--icon--fill--hover) !important;
36
+ color: var(--pf-t--global--icon--color--regular) !important;
37
37
  }
38
38
 
39
39
  &--top {
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { MessageBox } from './MessageBox';
4
+
5
+ describe('MessageBox', () => {
6
+ it('should render Message box', () => {
7
+ render(
8
+ <MessageBox>
9
+ <>Chatbot Messages</>
10
+ </MessageBox>
11
+ );
12
+ expect(screen.getByText('Chatbot Messages')).toBeTruthy();
13
+ });
14
+
15
+ it('should assign ref to Message box', () => {
16
+ const ref = React.createRef<HTMLDivElement>();
17
+ render(
18
+ <MessageBox ref={ref}>
19
+ <div>Test message content</div>
20
+ </MessageBox>
21
+ );
22
+
23
+ expect(ref.current).not.toBeNull();
24
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
25
+ });
26
+ });
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+ import { fireEvent, render, screen } from '@testing-library/react';
3
+ import { PreviewAttachment } from './PreviewAttachment';
4
+
5
+ describe('PreviewAttachment', () => {
6
+ it('should render PreviewAttachment', () => {
7
+ render(
8
+ <PreviewAttachment
9
+ code="Hello world"
10
+ fileName="greetings.txt"
11
+ isModalOpen={true}
12
+ onEdit={jest.fn()}
13
+ handleModalToggle={jest.fn()}
14
+ />
15
+ );
16
+ expect(screen.getByText('Preview attachment')).toBeTruthy();
17
+ expect(screen.getByText('greetings')).toBeTruthy();
18
+ expect(screen.getAllByText('TEXT')).toBeTruthy();
19
+ });
20
+
21
+ it('should call onEdit handler when edit button is pressed', () => {
22
+ const onEdit = jest.fn();
23
+ render(
24
+ <PreviewAttachment
25
+ code="Hello world"
26
+ fileName="greetings.txt"
27
+ isModalOpen={true}
28
+ onEdit={onEdit}
29
+ handleModalToggle={jest.fn()}
30
+ />
31
+ );
32
+ fireEvent.click(screen.getByText('Edit'));
33
+
34
+ expect(onEdit).toHaveBeenCalled();
35
+ });
36
+ it('should call onDismiss handler when dismiss button is pressed', () => {
37
+ const onDismiss = jest.fn();
38
+ render(
39
+ <PreviewAttachment
40
+ code="Hello world"
41
+ fileName="greetings.txt"
42
+ isModalOpen={true}
43
+ onEdit={jest.fn()}
44
+ handleModalToggle={onDismiss}
45
+ />
46
+ );
47
+ fireEvent.click(screen.getByText('Dismiss'));
48
+
49
+ expect(onDismiss).toHaveBeenCalled();
50
+ });
51
+ });
@@ -0,0 +1,52 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import '@testing-library/jest-dom';
4
+ import userEvent from '@testing-library/user-event';
5
+ import { DownloadIcon } from '@patternfly/react-icons';
6
+ import ResponseActionButton from './ResponseActionButton';
7
+
8
+ describe('ResponseActionButton', () => {
9
+ it('renders aria-label correctly if not clicked', () => {
10
+ render(<ResponseActionButton icon={<DownloadIcon />} ariaLabel="Download" clickedAriaLabel="Downloaded" />);
11
+ expect(screen.getByRole('button', { name: 'Download' })).toBeTruthy();
12
+ });
13
+ it('renders aria-label correctly if clicked', () => {
14
+ render(
15
+ <ResponseActionButton icon={<DownloadIcon />} ariaLabel="Download" clickedAriaLabel="Downloaded" isClicked />
16
+ );
17
+ expect(screen.getByRole('button', { name: 'Downloaded' })).toBeTruthy();
18
+ });
19
+ it('renders tooltip correctly if not clicked', async () => {
20
+ render(
21
+ <ResponseActionButton icon={<DownloadIcon />} tooltipContent="Download" clickedTooltipContent="Downloaded" />
22
+ );
23
+ expect(screen.getByRole('button', { name: 'Download' })).toBeTruthy();
24
+ // clicking here just triggers the tooltip; in this button, the logic is divorced from whether it is actually clicked
25
+ await userEvent.click(screen.getByRole('button', { name: 'Download' }));
26
+ expect(screen.getByRole('tooltip', { name: 'Download' })).toBeTruthy();
27
+ });
28
+ it('renders tooltip correctly if clicked', async () => {
29
+ render(
30
+ <ResponseActionButton
31
+ icon={<DownloadIcon />}
32
+ tooltipContent="Download"
33
+ clickedTooltipContent="Downloaded"
34
+ isClicked
35
+ />
36
+ );
37
+ expect(screen.getByRole('button', { name: 'Downloaded' })).toBeTruthy();
38
+ // clicking here just triggers the tooltip; in this button, the logic is divorced from whether it is actually clicked
39
+ await userEvent.click(screen.getByRole('button', { name: 'Downloaded' }));
40
+ expect(screen.getByRole('tooltip', { name: 'Downloaded' })).toBeTruthy();
41
+ });
42
+ it('if clicked variant for tooltip is not supplied, it uses the default', async () => {
43
+ render(<ResponseActionButton icon={<DownloadIcon />} tooltipContent="Download" isClicked />);
44
+ // clicking here just triggers the tooltip; in this button, the logic is divorced from whether it is actually clicked
45
+ await userEvent.click(screen.getByRole('button', { name: 'Download' }));
46
+ expect(screen.getByRole('button', { name: 'Download' })).toBeTruthy();
47
+ });
48
+ it('if clicked variant for aria label is not supplied, it uses the default', async () => {
49
+ render(<ResponseActionButton icon={<DownloadIcon />} ariaLabel="Download" isClicked />);
50
+ expect(screen.getByRole('button', { name: 'Download' })).toBeTruthy();
51
+ });
52
+ });
@@ -4,6 +4,8 @@ import { Button, Icon, Tooltip, TooltipProps } from '@patternfly/react-core';
4
4
  export interface ResponseActionButtonProps {
5
5
  /** Aria-label for the button. Defaults to the value of the tooltipContent if none provided */
6
6
  ariaLabel?: string;
7
+ /** Aria-label for the button, shown when the button is clicked. Defaults to the value of ariaLabel or tooltipContent if not provided. */
8
+ clickedAriaLabel?: string;
7
9
  /** Icon for the button */
8
10
  icon: React.ReactNode;
9
11
  /** On-click handler for the button */
@@ -14,43 +16,72 @@ export interface ResponseActionButtonProps {
14
16
  isDisabled?: boolean;
15
17
  /** Content shown in the tooltip */
16
18
  tooltipContent?: string;
19
+ /** Content shown in the tooltip when the button is clicked. Defaults to the value of tooltipContent if not provided. */
20
+ clickedTooltipContent?: string;
17
21
  /** Props to control the PF Tooltip component */
18
22
  tooltipProps?: TooltipProps;
23
+ /** Whether button is in clicked state */
24
+ isClicked?: boolean;
25
+ /** Ref applied to button */
26
+ innerRef?: React.Ref<HTMLButtonElement>;
19
27
  }
20
28
 
21
- export const ResponseActionButton: React.FunctionComponent<ResponseActionButtonProps> = ({
29
+ export const ResponseActionButtonBase: React.FunctionComponent<ResponseActionButtonProps> = ({
22
30
  ariaLabel,
31
+ clickedAriaLabel = ariaLabel,
23
32
  className,
24
33
  icon,
25
34
  isDisabled,
26
35
  onClick,
27
36
  tooltipContent,
28
- tooltipProps
29
- }) => (
30
- <Tooltip
31
- id={`pf-chatbot__tooltip-response-action-${tooltipContent}`}
32
- content={tooltipContent}
33
- position="bottom"
34
- entryDelay={tooltipProps?.entryDelay || 0}
35
- exitDelay={tooltipProps?.exitDelay || 0}
36
- distance={tooltipProps?.distance || 8}
37
- animationDuration={tooltipProps?.animationDuration || 0}
38
- {...tooltipProps}
39
- >
40
- <Button
41
- variant="plain"
42
- className={`pf-chatbot__button--response-action ${className ?? ''}`}
43
- aria-label={ariaLabel ?? tooltipContent}
44
- icon={
45
- <Icon isInline size="lg">
46
- {icon}
47
- </Icon>
48
- }
49
- isDisabled={isDisabled}
50
- onClick={onClick}
51
- size="sm"
52
- ></Button>
53
- </Tooltip>
54
- );
37
+ clickedTooltipContent = tooltipContent,
38
+ tooltipProps,
39
+ isClicked = false,
40
+ innerRef,
41
+ ...props
42
+ }) => {
43
+ const generateAriaLabel = () => {
44
+ if (ariaLabel) {
45
+ return isClicked ? clickedAriaLabel : ariaLabel;
46
+ }
47
+ return isClicked ? clickedTooltipContent : tooltipContent;
48
+ };
49
+
50
+ return (
51
+ <Tooltip
52
+ id={`pf-chatbot__tooltip-response-action-${tooltipContent}`}
53
+ content={isClicked ? clickedTooltipContent : tooltipContent}
54
+ aria-live="polite"
55
+ position="bottom"
56
+ entryDelay={tooltipProps?.entryDelay || 0}
57
+ exitDelay={tooltipProps?.exitDelay || 0}
58
+ distance={tooltipProps?.distance || 8}
59
+ animationDuration={tooltipProps?.animationDuration || 0}
60
+ // prevents VO announcements of both aria label and tooltip
61
+ aria="none"
62
+ {...tooltipProps}
63
+ >
64
+ <Button
65
+ variant="plain"
66
+ className={`pf-chatbot__button--response-action ${isClicked ? 'pf-chatbot__button--response-action-clicked' : ''} ${className ?? ''}`}
67
+ aria-label={generateAriaLabel()}
68
+ icon={
69
+ <Icon isInline size="lg">
70
+ {icon}
71
+ </Icon>
72
+ }
73
+ isDisabled={isDisabled}
74
+ onClick={onClick}
75
+ size="sm"
76
+ ref={innerRef}
77
+ {...props}
78
+ ></Button>
79
+ </Tooltip>
80
+ );
81
+ };
82
+
83
+ const ResponseActionButton = React.forwardRef((props: ResponseActionButtonProps, ref: React.Ref<HTMLButtonElement>) => (
84
+ <ResponseActionButtonBase innerRef={ref} {...props} />
85
+ ));
55
86
 
56
87
  export default ResponseActionButton;
@@ -3,7 +3,8 @@
3
3
  gap: var(--pf-t--global--spacer--xs);
4
4
  grid-template-columns: repeat(auto-fit, minmax(0, max-content));
5
5
 
6
- .pf-v6-c-button {
6
+ .pf-chatbot__button--response-action.pf-v6-c-button.pf-m-plain.pf-m-small {
7
+ --pf-v6-c-button__icon--Color: var(--pf-t--global--icon--color--subtle);
7
8
  border-radius: var(--pf-t--global--border--radius--pill);
8
9
  width: 2.3125rem;
9
10
  height: 2.3125rem;
@@ -11,16 +12,17 @@
11
12
  align-items: center;
12
13
  justify-content: center;
13
14
 
14
- .pf-v6-c-button__icon {
15
- color: var(--pf-t--global--icon--color--subtle);
15
+ &:hover {
16
+ --pf-v6-c-button__icon--Color: var(--pf-t--global--icon--color--subtle);
16
17
  }
17
-
18
- // Interactive states
19
- &:hover,
20
18
  &:focus {
21
- .pf-v6-c-button__icon {
22
- color: var(--pf-t--global--icon--color--subtle);
23
- }
19
+ --pf-v6-c-button--hover--BackgroundColor: var(--pf-t--global--background--color--action--plain--alt--clicked);
20
+ --pf-v6-c-button__icon--Color: var(--pf-t--global--icon--color--regular);
24
21
  }
25
22
  }
26
23
  }
24
+
25
+ .pf-v6-c-button.pf-chatbot__button--response-action-clicked.pf-v6-c-button.pf-m-plain.pf-m-small {
26
+ --pf-v6-c-button--m-plain--BackgroundColor: var(--pf-t--global--background--color--action--plain--alt--clicked);
27
+ --pf-v6-c-button__icon--Color: var(--pf-t--global--icon--color--regular);
28
+ }
@@ -4,27 +4,32 @@ import '@testing-library/jest-dom';
4
4
  import ResponseActions from './ResponseActions';
5
5
  import userEvent from '@testing-library/user-event';
6
6
  import { DownloadIcon, InfoCircleIcon, RedoIcon } from '@patternfly/react-icons';
7
+ import Message from '../Message';
7
8
 
8
9
  const ALL_ACTIONS = [
9
- { type: 'positive', label: 'Good response' },
10
- { type: 'negative', label: 'Bad response' },
11
- { type: 'copy', label: 'Copy' },
12
- { type: 'share', label: 'Share' },
13
- { type: 'listen', label: 'Listen' }
10
+ { type: 'positive', label: 'Good response', clickedLabel: 'Response recorded' },
11
+ { type: 'negative', label: 'Bad response', clickedLabel: 'Response recorded' },
12
+ { type: 'copy', label: 'Copy', clickedLabel: 'Copied' },
13
+ { type: 'share', label: 'Share', clickedLabel: 'Shared' },
14
+ { type: 'listen', label: 'Listen', clickedLabel: 'Listening' }
14
15
  ];
15
16
 
16
17
  const CUSTOM_ACTIONS = [
17
18
  {
18
19
  regenerate: {
19
20
  ariaLabel: 'Regenerate',
21
+ clickedAriaLabel: 'Regenerated',
20
22
  onClick: jest.fn(),
21
23
  tooltipContent: 'Regenerate',
24
+ clickedTooltipContent: 'Regenerated',
22
25
  icon: <RedoIcon />
23
26
  },
24
27
  download: {
25
28
  ariaLabel: 'Download',
29
+ clickedAriaLabel: 'Downloaded',
26
30
  onClick: jest.fn(),
27
31
  tooltipContent: 'Download',
32
+ clickedTooltipContent: 'Downloaded',
28
33
  icon: <DownloadIcon />
29
34
  },
30
35
  info: {
@@ -37,6 +42,81 @@ const CUSTOM_ACTIONS = [
37
42
  ];
38
43
 
39
44
  describe('ResponseActions', () => {
45
+ afterEach(() => {
46
+ jest.clearAllMocks();
47
+ });
48
+ it('should handle click within group of buttons correctly', async () => {
49
+ render(
50
+ <ResponseActions
51
+ actions={{
52
+ positive: { onClick: jest.fn() },
53
+ negative: { onClick: jest.fn() },
54
+ copy: { onClick: jest.fn() },
55
+ share: { onClick: jest.fn() },
56
+ listen: { onClick: jest.fn() }
57
+ }}
58
+ />
59
+ );
60
+ const goodBtn = screen.getByRole('button', { name: 'Good response' });
61
+ const badBtn = screen.getByRole('button', { name: 'Bad response' });
62
+ const copyBtn = screen.getByRole('button', { name: 'Copy' });
63
+ const shareBtn = screen.getByRole('button', { name: 'Share' });
64
+ const listenBtn = screen.getByRole('button', { name: 'Listen' });
65
+ const buttons = [goodBtn, badBtn, copyBtn, shareBtn, listenBtn];
66
+ buttons.forEach((button) => {
67
+ expect(button).toBeTruthy();
68
+ });
69
+ await userEvent.click(goodBtn);
70
+ expect(screen.getByRole('button', { name: 'Response recorded' })).toHaveClass(
71
+ 'pf-chatbot__button--response-action-clicked'
72
+ );
73
+ let unclickedButtons = buttons.filter((button) => button !== goodBtn);
74
+ unclickedButtons.forEach((button) => {
75
+ expect(button).not.toHaveClass('pf-chatbot__button--response-action-clicked');
76
+ });
77
+ await userEvent.click(badBtn);
78
+ expect(screen.getByRole('button', { name: 'Response recorded' })).toHaveClass(
79
+ 'pf-chatbot__button--response-action-clicked'
80
+ );
81
+ unclickedButtons = buttons.filter((button) => button !== badBtn);
82
+ unclickedButtons.forEach((button) => {
83
+ expect(button).not.toHaveClass('pf-chatbot__button--response-action-clicked');
84
+ });
85
+ });
86
+ it('should handle click outside of group of buttons correctly', async () => {
87
+ // using message just so we have something outside the group that's rendered
88
+ render(
89
+ <Message
90
+ name="Bot"
91
+ role="bot"
92
+ avatar=""
93
+ content="Example with all prebuilt actions"
94
+ actions={{
95
+ positive: {},
96
+ negative: {}
97
+ }}
98
+ />
99
+ );
100
+ const goodBtn = screen.getByRole('button', { name: 'Good response' });
101
+ const badBtn = screen.getByRole('button', { name: 'Bad response' });
102
+ expect(goodBtn).toBeTruthy();
103
+ expect(badBtn).toBeTruthy();
104
+
105
+ await userEvent.click(goodBtn);
106
+ expect(screen.getByRole('button', { name: 'Response recorded' })).toHaveClass(
107
+ 'pf-chatbot__button--response-action-clicked'
108
+ );
109
+ expect(badBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
110
+
111
+ await userEvent.click(badBtn);
112
+ expect(screen.getByRole('button', { name: 'Response recorded' })).toHaveClass(
113
+ 'pf-chatbot__button--response-action-clicked'
114
+ );
115
+ expect(goodBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
116
+ await userEvent.click(screen.getByText('Example with all prebuilt actions'));
117
+ expect(goodBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
118
+ expect(badBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
119
+ });
40
120
  it('should render buttons correctly', () => {
41
121
  ALL_ACTIONS.forEach(({ type, label }) => {
42
122
  render(<ResponseActions actions={{ [type]: { onClick: jest.fn() } }} />);
@@ -53,6 +133,24 @@ describe('ResponseActions', () => {
53
133
  });
54
134
  });
55
135
 
136
+ it('should swap clicked and non-clicked aria labels on click', async () => {
137
+ ALL_ACTIONS.forEach(async ({ type, label, clickedLabel }) => {
138
+ render(<ResponseActions actions={{ [type]: { onClick: jest.fn() } }} />);
139
+ expect(screen.getByRole('button', { name: label })).toBeTruthy();
140
+ await userEvent.click(screen.getByRole('button', { name: label }));
141
+ expect(screen.getByRole('button', { name: clickedLabel })).toBeTruthy();
142
+ });
143
+ });
144
+
145
+ it('should swap clicked and non-clicked tooltips on click', async () => {
146
+ ALL_ACTIONS.forEach(async ({ type, label, clickedLabel }) => {
147
+ render(<ResponseActions actions={{ [type]: { onClick: jest.fn() } }} />);
148
+ expect(screen.getByRole('button', { name: label })).toBeTruthy();
149
+ await userEvent.click(screen.getByRole('button', { name: label }));
150
+ expect(screen.getByRole('tooltip', { name: clickedLabel })).toBeTruthy();
151
+ });
152
+ });
153
+
56
154
  it('should be able to change aria labels', () => {
57
155
  const actions = [
58
156
  { type: 'positive', ariaLabel: 'Thumbs up' },
@@ -7,11 +7,13 @@ import {
7
7
  OutlinedCopyIcon
8
8
  } from '@patternfly/react-icons';
9
9
  import ResponseActionButton from './ResponseActionButton';
10
- import { TooltipProps } from '@patternfly/react-core';
10
+ import { ButtonProps, TooltipProps } from '@patternfly/react-core';
11
11
 
12
- export interface ActionProps {
12
+ export interface ActionProps extends Omit<ButtonProps, 'ref'> {
13
13
  /** Aria-label for the button */
14
14
  ariaLabel?: string;
15
+ /** Aria-label for the button, shown when the button is clicked. */
16
+ clickedAriaLabel?: string;
15
17
  /** On-click handler for the button */
16
18
  onClick?: ((event: MouseEvent | React.MouseEvent<Element, MouseEvent> | KeyboardEvent) => void) | undefined;
17
19
  /** Class name for the button */
@@ -20,10 +22,18 @@ export interface ActionProps {
20
22
  isDisabled?: boolean;
21
23
  /** Content shown in the tooltip */
22
24
  tooltipContent?: string;
25
+ /** Content shown in the tooltip when the button is clicked. */
26
+ clickedTooltipContent?: string;
23
27
  /** Props to control the PF Tooltip component */
24
28
  tooltipProps?: TooltipProps;
25
29
  /** Icon for custom response action */
26
30
  icon?: React.ReactNode;
31
+ /** Ref for response action button */
32
+ ref?: React.Ref<HTMLButtonElement>;
33
+ /** Whether content launched by button, such as the feedback form, is expanded */
34
+ 'aria-expanded'?: boolean;
35
+ /** Id for content controlled by the button, such as the feedback form */
36
+ 'aria-controls'?: string;
27
37
  }
28
38
 
29
39
  export interface ResponseActionProps {
@@ -38,74 +48,135 @@ export interface ResponseActionProps {
38
48
  }
39
49
 
40
50
  export const ResponseActions: React.FunctionComponent<ResponseActionProps> = ({ actions }) => {
51
+ const [activeButton, setActiveButton] = React.useState<string>();
41
52
  const { positive, negative, copy, share, listen, ...additionalActions } = actions;
53
+ const responseActions = React.useRef<HTMLDivElement>(null);
54
+
55
+ React.useEffect(() => {
56
+ const handleClickOutside = (e) => {
57
+ if (responseActions.current && !responseActions.current.contains(e.target)) {
58
+ setActiveButton(undefined);
59
+ }
60
+ };
61
+ window.addEventListener('click', handleClickOutside);
62
+
63
+ return () => {
64
+ window.removeEventListener('click', handleClickOutside);
65
+ };
66
+ }, []);
67
+
68
+ const handleClick = (
69
+ e: MouseEvent | React.MouseEvent<Element, MouseEvent> | KeyboardEvent,
70
+ id: string,
71
+ onClick?: (event: MouseEvent | React.MouseEvent<Element, MouseEvent> | KeyboardEvent) => void
72
+ ) => {
73
+ setActiveButton(id);
74
+ onClick && onClick(e);
75
+ };
76
+
42
77
  return (
43
- <div className="pf-chatbot__response-actions">
78
+ <div ref={responseActions} className="pf-chatbot__response-actions">
44
79
  {positive && (
45
80
  <ResponseActionButton
46
81
  ariaLabel={positive.ariaLabel ?? 'Good response'}
47
- onClick={positive.onClick}
82
+ clickedAriaLabel={positive.ariaLabel ?? 'Response recorded'}
83
+ onClick={(e) => handleClick(e, 'positive', positive.onClick)}
48
84
  className={positive.className}
49
85
  isDisabled={positive.isDisabled}
50
86
  tooltipContent={positive.tooltipContent ?? 'Good response'}
87
+ clickedTooltipContent={positive.clickedTooltipContent ?? 'Response recorded'}
51
88
  tooltipProps={positive.tooltipProps}
52
89
  icon={<OutlinedThumbsUpIcon />}
90
+ isClicked={activeButton === 'positive'}
91
+ ref={positive.ref}
92
+ aria-expanded={positive['aria-expanded']}
93
+ aria-controls={positive['aria-controls']}
53
94
  ></ResponseActionButton>
54
95
  )}
55
96
  {negative && (
56
97
  <ResponseActionButton
57
98
  ariaLabel={negative.ariaLabel ?? 'Bad response'}
58
- onClick={negative.onClick}
99
+ clickedAriaLabel={negative.ariaLabel ?? 'Response recorded'}
100
+ onClick={(e) => handleClick(e, 'negative', negative.onClick)}
59
101
  className={negative.className}
60
102
  isDisabled={negative.isDisabled}
61
103
  tooltipContent={negative.tooltipContent ?? 'Bad response'}
104
+ clickedTooltipContent={negative.clickedTooltipContent ?? 'Response recorded'}
62
105
  tooltipProps={negative.tooltipProps}
63
106
  icon={<OutlinedThumbsDownIcon />}
107
+ isClicked={activeButton === 'negative'}
108
+ ref={negative.ref}
109
+ aria-expanded={negative['aria-expanded']}
110
+ aria-controls={negative['aria-controls']}
64
111
  ></ResponseActionButton>
65
112
  )}
66
113
  {copy && (
67
114
  <ResponseActionButton
68
115
  ariaLabel={copy.ariaLabel ?? 'Copy'}
69
- onClick={copy.onClick}
116
+ clickedAriaLabel={copy.ariaLabel ?? 'Copied'}
117
+ onClick={(e) => handleClick(e, 'copy', copy.onClick)}
70
118
  className={copy.className}
71
119
  isDisabled={copy.isDisabled}
72
120
  tooltipContent={copy.tooltipContent ?? 'Copy'}
121
+ clickedTooltipContent={copy.clickedTooltipContent ?? 'Copied'}
73
122
  tooltipProps={copy.tooltipProps}
74
123
  icon={<OutlinedCopyIcon />}
124
+ isClicked={activeButton === 'copy'}
125
+ ref={copy.ref}
126
+ aria-expanded={copy['aria-expanded']}
127
+ aria-controls={copy['aria-controls']}
75
128
  ></ResponseActionButton>
76
129
  )}
77
130
  {share && (
78
131
  <ResponseActionButton
79
132
  ariaLabel={share.ariaLabel ?? 'Share'}
80
- onClick={share.onClick}
133
+ clickedAriaLabel={share.ariaLabel ?? 'Shared'}
134
+ onClick={(e) => handleClick(e, 'share', share.onClick)}
81
135
  className={share.className}
82
136
  isDisabled={share.isDisabled}
83
137
  tooltipContent={share.tooltipContent ?? 'Share'}
138
+ clickedTooltipContent={share.clickedTooltipContent ?? 'Shared'}
84
139
  tooltipProps={share.tooltipProps}
85
140
  icon={<ExternalLinkAltIcon />}
141
+ isClicked={activeButton === 'share'}
142
+ ref={share.ref}
143
+ aria-expanded={share['aria-expanded']}
144
+ aria-controls={share['aria-controls']}
86
145
  ></ResponseActionButton>
87
146
  )}
88
147
  {listen && (
89
148
  <ResponseActionButton
90
149
  ariaLabel={listen.ariaLabel ?? 'Listen'}
91
- onClick={listen.onClick}
150
+ clickedAriaLabel={listen.ariaLabel ?? 'Listening'}
151
+ onClick={(e) => handleClick(e, 'listen', listen.onClick)}
92
152
  className={listen.className}
93
153
  isDisabled={listen.isDisabled}
94
154
  tooltipContent={listen.tooltipContent ?? 'Listen'}
155
+ clickedTooltipContent={listen.clickedTooltipContent ?? 'Listening'}
95
156
  tooltipProps={listen.tooltipProps}
96
157
  icon={<VolumeUpIcon />}
158
+ isClicked={activeButton === 'listen'}
159
+ ref={listen.ref}
160
+ aria-expanded={listen['aria-expanded']}
161
+ aria-controls={listen['aria-controls']}
97
162
  ></ResponseActionButton>
98
163
  )}
99
164
  {Object.keys(additionalActions).map((action) => (
100
165
  <ResponseActionButton
101
166
  key={action}
102
167
  ariaLabel={additionalActions[action]?.ariaLabel}
103
- onClick={additionalActions[action]?.onClick}
168
+ clickedAriaLabel={additionalActions[action]?.clickedAriaLabel}
169
+ onClick={(e) => handleClick(e, action, additionalActions[action]?.onClick)}
104
170
  className={additionalActions[action]?.className}
105
171
  isDisabled={additionalActions[action]?.isDisabled}
106
172
  tooltipContent={additionalActions[action]?.tooltipContent}
107
173
  tooltipProps={additionalActions[action]?.tooltipProps}
174
+ clickedTooltipContent={additionalActions[action]?.clickedTooltipContent}
108
175
  icon={additionalActions[action]?.icon}
176
+ isClicked={activeButton === action}
177
+ ref={additionalActions[action]?.ref}
178
+ aria-expanded={additionalActions[action]?.['aria-expanded']}
179
+ aria-controls={additionalActions[action]?.['aria-controls']}
109
180
  />
110
181
  ))}
111
182
  </div>
@@ -0,0 +1,34 @@
1
+ .pf-chatbot__settings-form-container {
2
+ width: 100%;
3
+ display: flex;
4
+ justify-content: center;
5
+ overflow: scroll;
6
+ }
7
+
8
+ .pf-chatbot__settings-form {
9
+ display: flex;
10
+ flex-direction: column;
11
+ max-width: 60rem;
12
+ flex: 1;
13
+ }
14
+
15
+ .pf-chatbot__settings-form-row {
16
+ font-size: var(--pf-t--global--font--size--body--lg);
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: space-between;
20
+ border-bottom: 1px solid var(--pf-t--global--border--color--default);
21
+ padding: var(--pf-t--global--spacer--lg);
22
+ font-weight: var(--pf-t--global--font--weight--body--bold);
23
+ }
24
+
25
+ .pf-chatbot__settings-form-row:last-of-type {
26
+ border-bottom: 0px;
27
+ }
28
+
29
+ .pf-chatbot__settings--title {
30
+ font-family: var(--pf-t--global--font--family--heading);
31
+ font-size: var(--pf-t--global--font--size--xl);
32
+ font-weight: var(--pf-t--global--font--weight--body--bold);
33
+ text-align: center;
34
+ }