@patternfly/chatbot 2.2.1 → 6.3.0-prerelease.10

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 (310) hide show
  1. package/dist/cjs/AttachmentEdit/AttachmentEdit.d.ts +2 -0
  2. package/dist/cjs/AttachmentEdit/AttachmentEdit.js +2 -2
  3. package/dist/cjs/Chatbot/Chatbot.d.ts +2 -0
  4. package/dist/cjs/Chatbot/Chatbot.js +2 -2
  5. package/dist/cjs/Chatbot/Chatbot.test.js +4 -0
  6. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +6 -0
  7. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -3
  8. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +27 -0
  9. package/dist/cjs/ChatbotFooter/ChatbotFooter.d.ts +1 -0
  10. package/dist/cjs/ChatbotFooter/ChatbotFooter.js +2 -2
  11. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.d.ts +1 -1
  12. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +5 -0
  13. package/dist/cjs/ChatbotHeader/ChatbotHeader.js +1 -1
  14. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +4 -2
  15. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +20 -6
  16. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -1
  17. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.js +5 -0
  18. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.js +1 -1
  19. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.d.ts +3 -2
  20. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +20 -6
  21. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -1
  22. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +5 -0
  23. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.d.ts +1 -0
  24. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -3
  25. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -1
  26. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +5 -0
  27. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.d.ts +1 -0
  28. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +2 -2
  29. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -1
  30. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +5 -0
  31. package/dist/cjs/ChatbotModal/ChatbotModal.d.ts +3 -0
  32. package/dist/cjs/ChatbotModal/ChatbotModal.js +2 -2
  33. package/dist/cjs/ChatbotModal/ChatbotModal.test.d.ts +1 -0
  34. package/dist/cjs/ChatbotModal/ChatbotModal.test.js +28 -0
  35. package/dist/cjs/ChatbotPopover/ChatbotPopover.js +1 -1
  36. package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.d.ts +1 -0
  37. package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.js +3 -3
  38. package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +4 -0
  39. package/dist/cjs/CodeModal/CodeModal.d.ts +2 -0
  40. package/dist/cjs/CodeModal/CodeModal.js +3 -3
  41. package/dist/cjs/CodeModal/CodeModal.test.d.ts +1 -0
  42. package/dist/cjs/CodeModal/CodeModal.test.js +15 -0
  43. package/dist/cjs/FileDetails/FileDetails.js +1 -1
  44. package/dist/cjs/Message/Message.d.ts +19 -1
  45. package/dist/cjs/Message/Message.js +58 -39
  46. package/dist/cjs/Message/Message.test.js +64 -0
  47. package/dist/cjs/Message/MessageInput.d.ts +18 -0
  48. package/dist/cjs/Message/MessageInput.js +34 -0
  49. package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +2 -0
  50. package/dist/cjs/Message/QuickResponse/QuickResponse.js +2 -2
  51. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +2 -0
  52. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +2 -2
  53. package/dist/cjs/Message/UserFeedback/UserFeedback.js +4 -4
  54. package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +4 -0
  55. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +4 -4
  56. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +4 -0
  57. package/dist/cjs/MessageBar/AttachButton.d.ts +1 -0
  58. package/dist/cjs/MessageBar/AttachButton.js +3 -3
  59. package/dist/cjs/MessageBar/AttachButton.test.js +4 -0
  60. package/dist/cjs/MessageBar/MessageBar.d.ts +5 -0
  61. package/dist/cjs/MessageBar/MessageBar.js +14 -13
  62. package/dist/cjs/MessageBar/MessageBar.test.js +13 -0
  63. package/dist/cjs/MessageBar/MicrophoneButton.d.ts +1 -0
  64. package/dist/cjs/MessageBar/MicrophoneButton.js +4 -4
  65. package/dist/cjs/MessageBar/SendButton.d.ts +1 -0
  66. package/dist/cjs/MessageBar/SendButton.js +3 -3
  67. package/dist/cjs/MessageBar/SendButton.test.js +4 -0
  68. package/dist/cjs/MessageBar/StopButton.d.ts +1 -0
  69. package/dist/cjs/MessageBar/StopButton.js +3 -3
  70. package/dist/cjs/MessageBar/StopButton.test.js +4 -0
  71. package/dist/cjs/MessageBox/MessageBox.d.ts +4 -0
  72. package/dist/cjs/MessageBox/MessageBox.js +21 -7
  73. package/dist/cjs/MessageBox/MessageBox.test.js +43 -0
  74. package/dist/cjs/PreviewAttachment/PreviewAttachment.d.ts +2 -0
  75. package/dist/cjs/PreviewAttachment/PreviewAttachment.js +2 -2
  76. package/dist/cjs/Settings/SettingsForm.d.ts +2 -0
  77. package/dist/cjs/Settings/SettingsForm.js +2 -2
  78. package/dist/cjs/Settings/SettingsForm.test.d.ts +1 -1
  79. package/dist/cjs/Settings/SettingsForm.test.js +12 -0
  80. package/dist/cjs/SourcesCard/SourcesCard.d.ts +7 -1
  81. package/dist/cjs/SourcesCard/SourcesCard.js +17 -11
  82. package/dist/cjs/SourcesCard/SourcesCard.test.js +25 -15
  83. package/dist/cjs/TermsOfUse/TermsOfUse.d.ts +2 -0
  84. package/dist/cjs/TermsOfUse/TermsOfUse.js +5 -5
  85. package/dist/cjs/tracking/console_tracking_provider.d.ts +4 -5
  86. package/dist/cjs/tracking/console_tracking_provider.js +22 -15
  87. package/dist/cjs/tracking/posthog_tracking_provider.d.ts +2 -2
  88. package/dist/cjs/tracking/posthog_tracking_provider.js +21 -12
  89. package/dist/cjs/tracking/segment_tracking_provider.d.ts +2 -2
  90. package/dist/cjs/tracking/segment_tracking_provider.js +21 -12
  91. package/dist/cjs/tracking/trackingProviderProxy.d.ts +1 -1
  92. package/dist/cjs/tracking/trackingProviderProxy.js +2 -2
  93. package/dist/cjs/tracking/tracking_api.d.ts +1 -1
  94. package/dist/cjs/tracking/tracking_registry.js +46 -12
  95. package/dist/cjs/tracking/tracking_spi.d.ts +15 -5
  96. package/dist/cjs/tracking/tracking_spi.js +9 -0
  97. package/dist/cjs/tracking/umami_tracking_provider.d.ts +6 -2
  98. package/dist/cjs/tracking/umami_tracking_provider.js +66 -22
  99. package/dist/css/main.css +225 -22
  100. package/dist/css/main.css.map +1 -1
  101. package/dist/esm/AttachmentEdit/AttachmentEdit.d.ts +2 -0
  102. package/dist/esm/AttachmentEdit/AttachmentEdit.js +2 -2
  103. package/dist/esm/Chatbot/Chatbot.d.ts +2 -0
  104. package/dist/esm/Chatbot/Chatbot.js +2 -2
  105. package/dist/esm/Chatbot/Chatbot.test.js +4 -0
  106. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +6 -0
  107. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -3
  108. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +27 -0
  109. package/dist/esm/ChatbotFooter/ChatbotFooter.d.ts +1 -0
  110. package/dist/esm/ChatbotFooter/ChatbotFooter.js +2 -2
  111. package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +1 -1
  112. package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +5 -0
  113. package/dist/esm/ChatbotHeader/ChatbotHeader.js +1 -1
  114. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +4 -2
  115. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +20 -6
  116. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -1
  117. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +5 -0
  118. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.js +1 -1
  119. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.d.ts +3 -2
  120. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +20 -6
  121. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -1
  122. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +5 -0
  123. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.d.ts +1 -0
  124. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -3
  125. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -1
  126. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +5 -0
  127. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.d.ts +1 -0
  128. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +2 -2
  129. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -1
  130. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +5 -0
  131. package/dist/esm/ChatbotModal/ChatbotModal.d.ts +3 -0
  132. package/dist/esm/ChatbotModal/ChatbotModal.js +2 -2
  133. package/dist/esm/ChatbotModal/ChatbotModal.test.d.ts +1 -0
  134. package/dist/esm/ChatbotModal/ChatbotModal.test.js +23 -0
  135. package/dist/esm/ChatbotPopover/ChatbotPopover.js +1 -1
  136. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.d.ts +1 -0
  137. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.js +3 -3
  138. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +4 -0
  139. package/dist/esm/CodeModal/CodeModal.d.ts +2 -0
  140. package/dist/esm/CodeModal/CodeModal.js +3 -3
  141. package/dist/esm/CodeModal/CodeModal.test.d.ts +1 -0
  142. package/dist/esm/CodeModal/CodeModal.test.js +10 -0
  143. package/dist/esm/FileDetails/FileDetails.js +1 -1
  144. package/dist/esm/Message/Message.d.ts +19 -1
  145. package/dist/esm/Message/Message.js +58 -39
  146. package/dist/esm/Message/Message.test.js +64 -0
  147. package/dist/esm/Message/MessageInput.d.ts +18 -0
  148. package/dist/esm/Message/MessageInput.js +29 -0
  149. package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +2 -0
  150. package/dist/esm/Message/QuickResponse/QuickResponse.js +2 -2
  151. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +2 -0
  152. package/dist/esm/Message/QuickStarts/QuickStartTile.js +2 -2
  153. package/dist/esm/Message/UserFeedback/UserFeedback.js +4 -4
  154. package/dist/esm/Message/UserFeedback/UserFeedback.test.js +4 -0
  155. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +4 -4
  156. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +4 -0
  157. package/dist/esm/MessageBar/AttachButton.d.ts +1 -0
  158. package/dist/esm/MessageBar/AttachButton.js +3 -3
  159. package/dist/esm/MessageBar/AttachButton.test.js +4 -0
  160. package/dist/esm/MessageBar/MessageBar.d.ts +5 -0
  161. package/dist/esm/MessageBar/MessageBar.js +14 -13
  162. package/dist/esm/MessageBar/MessageBar.test.js +13 -0
  163. package/dist/esm/MessageBar/MicrophoneButton.d.ts +1 -0
  164. package/dist/esm/MessageBar/MicrophoneButton.js +4 -4
  165. package/dist/esm/MessageBar/SendButton.d.ts +1 -0
  166. package/dist/esm/MessageBar/SendButton.js +3 -3
  167. package/dist/esm/MessageBar/SendButton.test.js +4 -0
  168. package/dist/esm/MessageBar/StopButton.d.ts +1 -0
  169. package/dist/esm/MessageBar/StopButton.js +3 -3
  170. package/dist/esm/MessageBar/StopButton.test.js +4 -0
  171. package/dist/esm/MessageBox/MessageBox.d.ts +4 -0
  172. package/dist/esm/MessageBox/MessageBox.js +21 -7
  173. package/dist/esm/MessageBox/MessageBox.test.js +44 -1
  174. package/dist/esm/PreviewAttachment/PreviewAttachment.d.ts +2 -0
  175. package/dist/esm/PreviewAttachment/PreviewAttachment.js +2 -2
  176. package/dist/esm/Settings/SettingsForm.d.ts +2 -0
  177. package/dist/esm/Settings/SettingsForm.js +2 -2
  178. package/dist/esm/Settings/SettingsForm.test.d.ts +1 -1
  179. package/dist/esm/Settings/SettingsForm.test.js +12 -0
  180. package/dist/esm/SourcesCard/SourcesCard.d.ts +7 -1
  181. package/dist/esm/SourcesCard/SourcesCard.js +18 -12
  182. package/dist/esm/SourcesCard/SourcesCard.test.js +25 -15
  183. package/dist/esm/TermsOfUse/TermsOfUse.d.ts +2 -0
  184. package/dist/esm/TermsOfUse/TermsOfUse.js +5 -5
  185. package/dist/esm/tracking/console_tracking_provider.d.ts +4 -5
  186. package/dist/esm/tracking/console_tracking_provider.js +22 -15
  187. package/dist/esm/tracking/posthog_tracking_provider.d.ts +2 -2
  188. package/dist/esm/tracking/posthog_tracking_provider.js +21 -12
  189. package/dist/esm/tracking/segment_tracking_provider.d.ts +2 -2
  190. package/dist/esm/tracking/segment_tracking_provider.js +21 -12
  191. package/dist/esm/tracking/trackingProviderProxy.d.ts +1 -1
  192. package/dist/esm/tracking/trackingProviderProxy.js +2 -2
  193. package/dist/esm/tracking/tracking_api.d.ts +1 -1
  194. package/dist/esm/tracking/tracking_registry.js +46 -12
  195. package/dist/esm/tracking/tracking_spi.d.ts +15 -5
  196. package/dist/esm/tracking/tracking_spi.js +8 -1
  197. package/dist/esm/tracking/umami_tracking_provider.d.ts +6 -2
  198. package/dist/esm/tracking/umami_tracking_provider.js +66 -22
  199. package/dist/tsconfig.tsbuildinfo +1 -1
  200. package/package.json +1 -1
  201. package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +18 -14
  202. package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentEdit.tsx +10 -1
  203. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +74 -104
  204. package/patternfly-docs/content/extensions/chatbot/examples/Messages/FileDetailsLabel.tsx +48 -37
  205. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +33 -0
  206. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +34 -0
  207. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +11 -0
  208. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +71 -13
  209. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +3 -1
  210. package/patternfly-docs/content/extensions/chatbot/examples/Messages/PreviewAttachment.tsx +10 -1
  211. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +80 -104
  212. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +44 -2
  213. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +13 -2
  214. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithActions.tsx +9 -0
  215. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSelection.tsx +11 -2
  216. package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactSettings.tsx +289 -0
  217. package/patternfly-docs/content/extensions/chatbot/examples/UI/TermsOfUseCompact.tsx +136 -0
  218. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +15 -1
  219. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +8 -1
  220. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +6 -3
  221. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +2 -0
  222. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +2 -0
  223. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotCompact.tsx +481 -0
  224. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotInDrawer.tsx +2 -0
  225. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +2 -0
  226. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +62 -57
  227. package/patternfly-docs/content/extensions/chatbot/examples/demos/Feedback.tsx +2 -0
  228. package/src/AttachmentEdit/AttachmentEdit.tsx +5 -1
  229. package/src/Chatbot/Chatbot.scss +7 -0
  230. package/src/Chatbot/Chatbot.test.tsx +9 -0
  231. package/src/Chatbot/Chatbot.tsx +4 -1
  232. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +38 -3
  233. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +71 -0
  234. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +23 -2
  235. package/src/ChatbotFooter/ChatbotFooter.scss +5 -0
  236. package/src/ChatbotFooter/ChatbotFooter.test.tsx +10 -0
  237. package/src/ChatbotFooter/ChatbotFooter.tsx +3 -1
  238. package/src/ChatbotHeader/ChatbotHeader.scss +25 -0
  239. package/src/ChatbotHeader/ChatbotHeader.tsx +1 -1
  240. package/src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx +6 -0
  241. package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +12 -6
  242. package/src/ChatbotHeader/ChatbotHeaderMain.tsx +3 -1
  243. package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +8 -0
  244. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +10 -5
  245. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx +6 -0
  246. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx +5 -2
  247. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx +10 -0
  248. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx +4 -0
  249. package/src/ChatbotModal/ChatbotModal.scss +15 -4
  250. package/src/ChatbotModal/ChatbotModal.test.tsx +59 -0
  251. package/src/ChatbotModal/ChatbotModal.tsx +5 -1
  252. package/src/ChatbotPopover/ChatbotPopover.scss +9 -5
  253. package/src/ChatbotPopover/ChatbotPopover.tsx +1 -1
  254. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.scss +9 -1
  255. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx +13 -0
  256. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.tsx +13 -2
  257. package/src/ChatbotWelcomePrompt/__snapshots__/ChatbotWelcomePrompt.test.tsx.snap +1 -1
  258. package/src/CodeModal/CodeModal.scss +11 -3
  259. package/src/CodeModal/CodeModal.test.tsx +24 -0
  260. package/src/CodeModal/CodeModal.tsx +6 -2
  261. package/src/FileDetails/FileDetails.tsx +1 -1
  262. package/src/FileDetails/__snapshots__/FileDetails.test.tsx.snap +1 -1
  263. package/src/FileDetailsLabel/__snapshots__/FileDetailsLabel.test.tsx.snap +1 -1
  264. package/src/Message/Message.scss +31 -0
  265. package/src/Message/Message.test.tsx +83 -0
  266. package/src/Message/Message.tsx +121 -56
  267. package/src/Message/MessageInput.tsx +59 -0
  268. package/src/Message/QuickResponse/QuickResponse.tsx +5 -1
  269. package/src/Message/QuickStarts/QuickStartTile.tsx +5 -1
  270. package/src/Message/TextMessage/TextMessage.scss +25 -0
  271. package/src/Message/UserFeedback/UserFeedback.scss +24 -3
  272. package/src/Message/UserFeedback/UserFeedback.test.tsx +13 -0
  273. package/src/Message/UserFeedback/UserFeedback.tsx +4 -2
  274. package/src/Message/UserFeedback/UserFeedbackComplete.test.tsx +4 -0
  275. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +10 -2
  276. package/src/MessageBar/AttachButton.scss +10 -0
  277. package/src/MessageBar/AttachButton.test.tsx +4 -0
  278. package/src/MessageBar/AttachButton.tsx +5 -2
  279. package/src/MessageBar/MessageBar.scss +17 -0
  280. package/src/MessageBar/MessageBar.test.tsx +13 -0
  281. package/src/MessageBar/MessageBar.tsx +23 -8
  282. package/src/MessageBar/MicrophoneButton.scss +10 -0
  283. package/src/MessageBar/MicrophoneButton.tsx +6 -3
  284. package/src/MessageBar/SendButton.scss +10 -0
  285. package/src/MessageBar/SendButton.test.tsx +5 -1
  286. package/src/MessageBar/SendButton.tsx +5 -2
  287. package/src/MessageBar/StopButton.scss +10 -0
  288. package/src/MessageBar/StopButton.test.tsx +5 -1
  289. package/src/MessageBar/StopButton.tsx +5 -2
  290. package/src/MessageBox/MessageBox.scss +6 -0
  291. package/src/MessageBox/MessageBox.test.tsx +45 -1
  292. package/src/MessageBox/MessageBox.tsx +16 -6
  293. package/src/PreviewAttachment/PreviewAttachment.tsx +5 -1
  294. package/src/Settings/Settings.scss +11 -0
  295. package/src/Settings/SettingsForm.test.tsx +17 -0
  296. package/src/Settings/SettingsForm.tsx +12 -2
  297. package/src/SourcesCard/SourcesCard.scss +11 -7
  298. package/src/SourcesCard/SourcesCard.test.tsx +30 -22
  299. package/src/SourcesCard/SourcesCard.tsx +56 -13
  300. package/src/TermsOfUse/TermsOfUse.scss +20 -0
  301. package/src/TermsOfUse/TermsOfUse.tsx +9 -4
  302. package/src/tracking/console_tracking_provider.ts +21 -17
  303. package/src/tracking/posthog_tracking_provider.ts +20 -13
  304. package/src/tracking/segment_tracking_provider.ts +20 -13
  305. package/src/tracking/trackingProviderProxy.ts +2 -2
  306. package/src/tracking/tracking_api.ts +1 -1
  307. package/src/tracking/tracking_registry.ts +46 -13
  308. package/src/tracking/tracking_spi.ts +18 -7
  309. package/src/tracking/umami_tracking_provider.ts +76 -20
  310. package/src/SourcesCard/__snapshots__/SourcesCard.test.tsx.snap +0 -34
@@ -10,7 +10,9 @@ import {
10
10
  AlertProps,
11
11
  Avatar,
12
12
  AvatarProps,
13
+ ButtonProps,
13
14
  ContentVariants,
15
+ FormProps,
14
16
  Label,
15
17
  LabelGroupProps,
16
18
  Timestamp,
@@ -44,6 +46,7 @@ import rehypeSanitize from 'rehype-sanitize';
44
46
  import { PluggableList } from 'react-markdown/lib';
45
47
  import LinkMessage from './LinkMessage/LinkMessage';
46
48
  import ErrorMessage from './ErrorMessage/ErrorMessage';
49
+ import MessageInput from './MessageInput';
47
50
 
48
51
  export interface MessageAttachment {
49
52
  /** Name of file attached to the message */
@@ -145,6 +148,24 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
145
148
  openLinkInNewTab?: boolean;
146
149
  /** Optional inline error message that can be displayed in the message */
147
150
  error?: AlertProps;
151
+ /** Props for links */
152
+ linkProps?: ButtonProps;
153
+ /** Whether message is in edit mode */
154
+ isEditable?: boolean;
155
+ /** Placeholder for edit input */
156
+ editPlaceholder?: string;
157
+ /** Label for the English word "Update" used in edit mode. */
158
+ updateWord?: string;
159
+ /** Label for the English word "Cancel" used in edit mode. */
160
+ cancelWord?: string;
161
+ /** Callback function for when edit mode update button is clicked */
162
+ onEditUpdate?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
163
+ /** Callback functionf or when edit cancel update button is clicked */
164
+ onEditCancel?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
165
+ /** Props for edit form */
166
+ editFormProps?: FormProps;
167
+ /** Sets message to compact styling. */
168
+ isCompact?: boolean;
148
169
  }
149
170
 
150
171
  export const MessageBase: React.FunctionComponent<MessageProps> = ({
@@ -173,9 +194,24 @@ export const MessageBase: React.FunctionComponent<MessageProps> = ({
173
194
  tableProps,
174
195
  openLinkInNewTab = true,
175
196
  additionalRehypePlugins = [],
197
+ linkProps,
176
198
  error,
199
+ isEditable,
200
+ editPlaceholder = 'Edit prompt message...',
201
+ updateWord = 'Update',
202
+ cancelWord = 'Cancel',
203
+ onEditUpdate,
204
+ onEditCancel,
205
+ editFormProps,
206
+ isCompact,
177
207
  ...props
178
208
  }: MessageProps) => {
209
+ const [messageText, setMessageText] = React.useState(content);
210
+
211
+ React.useEffect(() => {
212
+ setMessageText(content);
213
+ }, [content]);
214
+
179
215
  const { beforeMainContent, afterMainContent, endContent } = extraContent || {};
180
216
  let rehypePlugins: PluggableList = [rehypeUnwrapImages];
181
217
  if (openLinkInNewTab) {
@@ -193,6 +229,82 @@ export const MessageBase: React.FunctionComponent<MessageProps> = ({
193
229
  // Keep timestamps consistent between Timestamp component and aria-label
194
230
  const date = new Date();
195
231
  const dateString = timestamp ?? `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
232
+
233
+ const renderMessage = () => {
234
+ if (isLoading) {
235
+ return <MessageLoading loadingWord={loadingWord} />;
236
+ }
237
+ if (isEditable) {
238
+ return (
239
+ <>
240
+ {beforeMainContent && <>{beforeMainContent}</>}
241
+ <MessageInput
242
+ content={content}
243
+ editPlaceholder={editPlaceholder}
244
+ updateWord={updateWord}
245
+ cancelWord={cancelWord}
246
+ onEditUpdate={(event, text) => {
247
+ onEditUpdate && onEditUpdate(event);
248
+ setMessageText(text);
249
+ }}
250
+ onEditCancel={onEditCancel}
251
+ {...editFormProps}
252
+ />
253
+ </>
254
+ );
255
+ }
256
+ return (
257
+ <>
258
+ {beforeMainContent && <>{beforeMainContent}</>}
259
+ {error ? (
260
+ <ErrorMessage {...error} />
261
+ ) : (
262
+ <Markdown
263
+ components={{
264
+ p: (props) => <TextMessage component={ContentVariants.p} {...props} />,
265
+ code: ({ children, ...props }) => (
266
+ <CodeBlockMessage {...props} {...codeBlockProps}>
267
+ {children}
268
+ </CodeBlockMessage>
269
+ ),
270
+ h1: (props) => <TextMessage component={ContentVariants.h1} {...props} />,
271
+ h2: (props) => <TextMessage component={ContentVariants.h2} {...props} />,
272
+ h3: (props) => <TextMessage component={ContentVariants.h3} {...props} />,
273
+ h4: (props) => <TextMessage component={ContentVariants.h4} {...props} />,
274
+ h5: (props) => <TextMessage component={ContentVariants.h5} {...props} />,
275
+ h6: (props) => <TextMessage component={ContentVariants.h6} {...props} />,
276
+ blockquote: (props) => <TextMessage component={ContentVariants.blockquote} {...props} />,
277
+ ul: (props) => <UnorderedListMessage {...props} />,
278
+ ol: (props) => <OrderedListMessage {...props} />,
279
+ li: (props) => <ListItemMessage {...props} />,
280
+ table: (props) => <TableMessage {...props} {...tableProps} />,
281
+ tbody: (props) => <TbodyMessage {...props} />,
282
+ thead: (props) => <TheadMessage {...props} />,
283
+ tr: (props) => <TrMessage {...props} />,
284
+ td: (props) => {
285
+ // Conflicts with Td type
286
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
287
+ const { width, ...rest } = props;
288
+ return <TdMessage {...rest} />;
289
+ },
290
+ th: (props) => <ThMessage {...props} />,
291
+ img: (props) => <ImageMessage {...props} />,
292
+ a: (props) => (
293
+ <LinkMessage href={props.href} rel={props.rel} target={props.target} {...linkProps}>
294
+ {props.children}
295
+ </LinkMessage>
296
+ )
297
+ }}
298
+ remarkPlugins={[remarkGfm]}
299
+ rehypePlugins={rehypePlugins}
300
+ >
301
+ {messageText}
302
+ </Markdown>
303
+ )}
304
+ </>
305
+ );
306
+ };
307
+
196
308
  return (
197
309
  <section
198
310
  aria-label={`Message from ${role} - ${dateString}`}
@@ -225,60 +337,9 @@ export const MessageBase: React.FunctionComponent<MessageProps> = ({
225
337
  </div>
226
338
  <div className="pf-chatbot__message-response">
227
339
  <div className="pf-chatbot__message-and-actions">
228
- {isLoading ? (
229
- <MessageLoading loadingWord={loadingWord} />
230
- ) : (
231
- <>
232
- {beforeMainContent && <>{beforeMainContent}</>}
233
- {error ? (
234
- <ErrorMessage {...error} />
235
- ) : (
236
- <Markdown
237
- components={{
238
- p: (props) => <TextMessage component={ContentVariants.p} {...props} />,
239
- code: ({ children, ...props }) => (
240
- <CodeBlockMessage {...props} {...codeBlockProps}>
241
- {children}
242
- </CodeBlockMessage>
243
- ),
244
- h1: (props) => <TextMessage component={ContentVariants.h1} {...props} />,
245
- h2: (props) => <TextMessage component={ContentVariants.h2} {...props} />,
246
- h3: (props) => <TextMessage component={ContentVariants.h3} {...props} />,
247
- h4: (props) => <TextMessage component={ContentVariants.h4} {...props} />,
248
- h5: (props) => <TextMessage component={ContentVariants.h5} {...props} />,
249
- h6: (props) => <TextMessage component={ContentVariants.h6} {...props} />,
250
- blockquote: (props) => <TextMessage component={ContentVariants.blockquote} {...props} />,
251
- ul: (props) => <UnorderedListMessage {...props} />,
252
- ol: (props) => <OrderedListMessage {...props} />,
253
- li: (props) => <ListItemMessage {...props} />,
254
- table: (props) => <TableMessage {...props} {...tableProps} />,
255
- tbody: (props) => <TbodyMessage {...props} />,
256
- thead: (props) => <TheadMessage {...props} />,
257
- tr: (props) => <TrMessage {...props} />,
258
- td: (props) => {
259
- // Conflicts with Td type
260
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
261
- const { width, ...rest } = props;
262
- return <TdMessage {...rest} />;
263
- },
264
- th: (props) => <ThMessage {...props} />,
265
- img: (props) => <ImageMessage {...props} />,
266
- a: (props) => (
267
- <LinkMessage href={props.href} rel={props.rel} target={props.target}>
268
- {props.children}
269
- </LinkMessage>
270
- )
271
- }}
272
- remarkPlugins={[remarkGfm]}
273
- rehypePlugins={rehypePlugins}
274
- >
275
- {content}
276
- </Markdown>
277
- )}
278
- {afterMainContent && <>{afterMainContent}</>}
279
- </>
280
- )}
281
- {!isLoading && sources && <SourcesCard {...sources} />}
340
+ {renderMessage()}
341
+ {afterMainContent && <>{afterMainContent}</>}
342
+ {!isLoading && sources && <SourcesCard {...sources} isCompact={isCompact} />}
282
343
  {quickStarts && quickStarts.quickStart && (
283
344
  <QuickStartTile
284
345
  quickStart={quickStarts.quickStart}
@@ -288,15 +349,19 @@ export const MessageBase: React.FunctionComponent<MessageProps> = ({
288
349
  prerequisiteWord={quickStarts.prerequisiteWord}
289
350
  prerequisiteWordPlural={quickStarts.prerequisiteWordPlural}
290
351
  quickStartButtonAriaLabel={quickStarts.quickStartButtonAriaLabel}
352
+ isCompact={isCompact}
291
353
  />
292
354
  )}
293
355
  {!isLoading && actions && <ResponseActions actions={actions} />}
294
- {userFeedbackForm && <UserFeedback {...userFeedbackForm} timestamp={dateString} />}
295
- {userFeedbackComplete && <UserFeedbackComplete {...userFeedbackComplete} timestamp={dateString} />}
356
+ {userFeedbackForm && <UserFeedback {...userFeedbackForm} timestamp={dateString} isCompact={isCompact} />}
357
+ {userFeedbackComplete && (
358
+ <UserFeedbackComplete {...userFeedbackComplete} timestamp={dateString} isCompact={isCompact} />
359
+ )}
296
360
  {!isLoading && quickResponses && (
297
361
  <QuickResponse
298
362
  quickResponses={quickResponses}
299
363
  quickResponseContainerProps={quickResponseContainerProps}
364
+ isCompact={isCompact}
300
365
  />
301
366
  )}
302
367
  </div>
@@ -0,0 +1,59 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message Input
3
+ // ============================================================================
4
+
5
+ import React from 'react';
6
+ import { ActionGroup, Button, Form, FormProps, TextArea } from '@patternfly/react-core';
7
+
8
+ export interface MessageInputProps extends FormProps {
9
+ /** Placeholder for edit input */
10
+ editPlaceholder?: string;
11
+ /** Label for the English word "Update" used in edit mode. */
12
+ updateWord?: string;
13
+ /** Label for the English word "Cancel" used in edit mode. */
14
+ cancelWord?: string;
15
+ /** Callback function for when edit mode update button is clicked */
16
+ onEditUpdate?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>, value: string) => void;
17
+ /** Callback functionf or when edit cancel update button is clicked */
18
+ onEditCancel?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
19
+ /** Message text */
20
+ content?: string;
21
+ }
22
+
23
+ const MessageInput: React.FunctionComponent<MessageInputProps> = ({
24
+ editPlaceholder = 'Edit prompt message...',
25
+ updateWord = 'Update',
26
+ cancelWord = 'Cancel',
27
+ onEditUpdate,
28
+ onEditCancel,
29
+ content,
30
+ ...props
31
+ }: MessageInputProps) => {
32
+ const [messageText, setMessageText] = React.useState(content ?? '');
33
+
34
+ const onChange = (event: React.FormEvent<HTMLTextAreaElement>, value: string) => {
35
+ setMessageText(value);
36
+ };
37
+
38
+ return (
39
+ <Form {...props}>
40
+ <TextArea
41
+ placeholder={editPlaceholder}
42
+ value={messageText}
43
+ onChange={onChange}
44
+ aria-label={editPlaceholder}
45
+ autoResize
46
+ />
47
+ <ActionGroup className="pf-chatbot__message-edit-buttons">
48
+ <Button variant="primary" onClick={(event) => onEditUpdate && onEditUpdate(event, messageText)}>
49
+ {updateWord}
50
+ </Button>
51
+ <Button variant="secondary" onClick={onEditCancel}>
52
+ {cancelWord}
53
+ </Button>
54
+ </ActionGroup>
55
+ </Form>
56
+ );
57
+ };
58
+
59
+ export default MessageInput;
@@ -15,12 +15,15 @@ export interface QuickResponseProps {
15
15
  quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
16
16
  /** Callback when a response is clicked; used in feedback cards */
17
17
  onSelect?: (id: string) => void;
18
+ /** Sets the quick responses to compact styling */
19
+ isCompact?: boolean;
18
20
  }
19
21
 
20
22
  export const QuickResponse: React.FunctionComponent<QuickResponseProps> = ({
21
23
  quickResponses,
22
24
  quickResponseContainerProps = { numLabels: 5 },
23
- onSelect
25
+ onSelect,
26
+ isCompact
24
27
  }: QuickResponseProps) => {
25
28
  const [selectedQuickResponse, setSelectedQuickResponse] = React.useState<string>();
26
29
 
@@ -42,6 +45,7 @@ export const QuickResponse: React.FunctionComponent<QuickResponseProps> = ({
42
45
  key={id}
43
46
  onClick={() => handleQuickResponseClick(id, onClick)}
44
47
  className={`${id === selectedQuickResponse ? 'pf-chatbot__message-quick-response--selected' : ''} ${className ? className : ''}`}
48
+ isCompact={isCompact}
45
49
  {...props}
46
50
  >
47
51
  {content}
@@ -49,6 +49,8 @@ export interface QuickStartTileProps {
49
49
  prerequisiteWordPlural?: string;
50
50
  /** Aria-label for the quick start description button */
51
51
  quickStartButtonAriaLabel?: string;
52
+ /** Sets the tile to compact styling */
53
+ isCompact?: boolean;
52
54
  }
53
55
 
54
56
  const QuickStartTile: React.FC<QuickStartTileProps> = ({
@@ -61,7 +63,8 @@ const QuickStartTile: React.FC<QuickStartTileProps> = ({
61
63
  prerequisiteWord,
62
64
  prerequisiteWordPlural,
63
65
  quickStartButtonAriaLabel,
64
- action
66
+ action,
67
+ isCompact
65
68
  }) => {
66
69
  const {
67
70
  metadata: { name: id },
@@ -105,6 +108,7 @@ const QuickStartTile: React.FC<QuickStartTileProps> = ({
105
108
  id={`${id}-chatbot-qs-tile`}
106
109
  style={{ height: '100%' }}
107
110
  data-testid={`chatbot-qs-card-${camelize(displayName)}`}
111
+ isCompact={isCompact}
108
112
  >
109
113
  <CardHeader
110
114
  {...(action && {
@@ -58,3 +58,28 @@
58
58
  }
59
59
  }
60
60
  }
61
+
62
+ // ============================================================================
63
+ // Information density styles
64
+ // ============================================================================
65
+ .pf-chatbot.pf-m-compact {
66
+ // Need to inline shorter text
67
+ .pf-chatbot__message-text {
68
+ .pf-v6-c-button.pf-m-link {
69
+ font-size: var(--pf-t--global--font--size--sm);
70
+ }
71
+
72
+ .pf-v6-c-content,
73
+ .pf-v6-c-content--small,
74
+ .pf-v6-c-content--blockquote,
75
+ p,
76
+ a {
77
+ --pf-v6-c-content--FontSize: var(--pf-t--global--font--size--sm);
78
+ }
79
+
80
+ .pf-v6-c-content--blockquote {
81
+ --pf-v6-c-content--blockquote--PaddingBlockStart: 0;
82
+ --pf-v6-c-content--blockquote--PaddingBlockEnd: 0;
83
+ }
84
+ }
85
+ }
@@ -11,6 +11,7 @@
11
11
  flex-direction: column;
12
12
  gap: var(--pf-t--global--spacer--lg);
13
13
  align-items: center;
14
+ text-align: center;
14
15
  }
15
16
  .pf-chatbot__feedback-complete-text {
16
17
  display: flex;
@@ -26,9 +27,6 @@
26
27
  align-items: center;
27
28
  justify-content: center;
28
29
  }
29
- .pf-chatbot__feedback-complete-body {
30
- text-align: center;
31
- }
32
30
  .pf-chatbot__feedback-complete-title {
33
31
  font-family: var(--pf-t--global--font--family--heading);
34
32
  font-size: var(--pf-t--global--font--size--lg);
@@ -51,3 +49,26 @@
51
49
  .pf-chatbot__feedback-card-optional {
52
50
  font-weight: initial;
53
51
  }
52
+
53
+ // Compact styles
54
+ .pf-v6-c-card.pf-m-compact.pf-chatbot__feedback-card {
55
+ .pf-chatbot__feedback-card-form.pf-m-compact {
56
+ --pf-v6-c-form--GridGap: var(--pf-t--global--spacer--md);
57
+ }
58
+ }
59
+
60
+ .pf-v6-c-card.pf-m-compact.pf-chatbot__feedback-card.pf-chatbot__feedback-card-complete {
61
+ div.pf-chatbot__feedback-complete-body {
62
+ gap: var(--pf-t--global--spacer--sm);
63
+ }
64
+
65
+ .pf-chatbot__feedback-complete-image {
66
+ width: 40px;
67
+ }
68
+
69
+ .pf-chatbot__feedback-card-complete-empty-header {
70
+ .pf-v6-c-card__header:first-child {
71
+ --pf-v6-c-card--first-child--PaddingBlockStart: var(--pf-t--global--spacer--sm);
72
+ }
73
+ }
74
+ }
@@ -233,4 +233,17 @@ describe('UserFeedback', () => {
233
233
  );
234
234
  expect(screen.getByTestId('card').parentElement).not.toHaveFocus();
235
235
  });
236
+ it('should handle isCompact', () => {
237
+ render(
238
+ <UserFeedback
239
+ timestamp="12/12/12"
240
+ onClose={jest.fn}
241
+ onSubmit={jest.fn}
242
+ quickResponses={MOCK_RESPONSES}
243
+ data-testid="card"
244
+ isCompact
245
+ />
246
+ );
247
+ expect(screen.getByTestId('card')).toHaveClass('pf-m-compact');
248
+ });
236
249
  });
@@ -71,6 +71,7 @@ const UserFeedback: React.FunctionComponent<UserFeedbackProps> = ({
71
71
  id,
72
72
  headingLevel: HeadingLevel = 'h1',
73
73
  focusOnLoad = true,
74
+ isCompact,
74
75
  ...props
75
76
  }: UserFeedbackProps) => {
76
77
  const [selectedResponse, setSelectedResponse] = React.useState<string>();
@@ -86,7 +87,7 @@ const UserFeedback: React.FunctionComponent<UserFeedbackProps> = ({
86
87
  return (
87
88
  /* card does not have ref forwarding; hence wrapper div */
88
89
  <div ref={divRef} id={id} tabIndex={0} aria-label={title}>
89
- <Card className={`pf-chatbot__feedback-card ${className ? className : ''}`} {...props}>
90
+ <Card isCompact={isCompact} className={`pf-chatbot__feedback-card ${className ? className : ''}`} {...props}>
90
91
  <CardHeader
91
92
  actions={{
92
93
  actions: <CloseButton onClose={onClose} ariaLabel={closeButtonAriaLabel} />
@@ -95,12 +96,13 @@ const UserFeedback: React.FunctionComponent<UserFeedbackProps> = ({
95
96
  <HeadingLevel className="pf-chatbot__feedback-card-title">{title}</HeadingLevel>
96
97
  </CardHeader>
97
98
  <CardBody>
98
- <Form className="pf-chatbot__feedback-card-form">
99
+ <Form className={`pf-chatbot__feedback-card-form ${isCompact ? 'pf-m-compact' : ''}`}>
99
100
  {quickResponses && (
100
101
  <QuickResponse
101
102
  quickResponses={quickResponses}
102
103
  quickResponseContainerProps={quickResponseContainerProps}
103
104
  onSelect={(id) => setSelectedResponse(id)}
105
+ isCompact={isCompact}
104
106
  />
105
107
  )}
106
108
  {hasTextArea && (
@@ -252,4 +252,8 @@ describe('UserFeedbackComplete', () => {
252
252
  render(<UserFeedbackComplete timestamp="12/12/12" data-testid="card" focusOnLoad={false} />);
253
253
  expect(screen.getByTestId('card').parentElement).not.toHaveFocus();
254
254
  });
255
+ it('should handle isCompact', () => {
256
+ render(<UserFeedbackComplete timestamp="12/12/12" data-testid="card" isCompact />);
257
+ expect(screen.getByTestId('card')).toHaveClass('pf-m-compact');
258
+ });
255
259
  });
@@ -63,6 +63,7 @@ const UserFeedbackComplete: React.FunctionComponent<UserFeedbackCompleteProps> =
63
63
  isLiveRegion,
64
64
  id,
65
65
  focusOnLoad = true,
66
+ isCompact,
66
67
  ...props
67
68
  }: UserFeedbackCompleteProps) => {
68
69
  const [timedOut, setTimedOut] = React.useState(false);
@@ -143,8 +144,15 @@ const UserFeedbackComplete: React.FunctionComponent<UserFeedbackCompleteProps> =
143
144
  aria-label={title}
144
145
  {...ouiaProps}
145
146
  >
146
- <Card className={`pf-chatbot__feedback-card ${className ? className : ''}`} {...props}>
147
+ <Card
148
+ isCompact={isCompact}
149
+ className={`pf-chatbot__feedback-card pf-chatbot__feedback-card-complete${className ? ` ${className}` : ''}`}
150
+ {...props}
151
+ >
147
152
  <CardHeader
153
+ className={
154
+ onClose ? 'pf-chatbot__feedback-card-complete-header' : 'pf-chatbot__feedback-card-complete-empty-header'
155
+ }
148
156
  actions={
149
157
  /* eslint-disable indent */
150
158
  onClose
@@ -200,7 +208,7 @@ const UserFeedbackComplete: React.FunctionComponent<UserFeedbackCompleteProps> =
200
208
  </div>
201
209
  <div className="pf-chatbot__feedback-complete-text">
202
210
  <CardTitle className="pf-chatbot__feedback-complete-title">{title}</CardTitle>
203
- <CardBody className={`pf-chatbot__feedback-complete-body`}>{body}</CardBody>
211
+ <CardBody className={`pf-chatbot__feedback-complete-card-body`}>{body}</CardBody>
204
212
  </div>
205
213
  </div>
206
214
  </Card>
@@ -34,3 +34,13 @@
34
34
  }
35
35
  }
36
36
  }
37
+
38
+ // ============================================================================
39
+ // Information density styles
40
+ // ============================================================================
41
+ .pf-v6-c-button.pf-chatbot__button--attach.pf-m-compact {
42
+ width: 1.5rem;
43
+ height: 1.5rem;
44
+ padding: var(--pf-t--global--spacer--sm);
45
+ align-items: center;
46
+ }
@@ -50,4 +50,8 @@ describe('Attach button', () => {
50
50
  expect(input.files).toHaveLength(1);
51
51
  expect(spy).toHaveBeenCalledTimes(1);
52
52
  });
53
+ it('should handle isCompact', () => {
54
+ render(<AttachButton isCompact data-testid="button" />);
55
+ expect(screen.getByTestId('button')).toHaveClass('pf-m-compact');
56
+ });
53
57
  });
@@ -25,6 +25,7 @@ export interface AttachButtonProps extends ButtonProps {
25
25
  tooltipContent?: string;
26
26
  /** Test id applied to input */
27
27
  inputTestId?: string;
28
+ isCompact?: boolean;
28
29
  }
29
30
 
30
31
  const AttachButtonBase: React.FunctionComponent<AttachButtonProps> = ({
@@ -36,6 +37,7 @@ const AttachButtonBase: React.FunctionComponent<AttachButtonProps> = ({
36
37
  innerRef,
37
38
  tooltipContent = 'Attach',
38
39
  inputTestId,
40
+ isCompact,
39
41
  ...props
40
42
  }: AttachButtonProps) => {
41
43
  const { open, getInputProps } = useDropzone({
@@ -62,15 +64,16 @@ const AttachButtonBase: React.FunctionComponent<AttachButtonProps> = ({
62
64
  <Button
63
65
  variant="plain"
64
66
  ref={innerRef}
65
- className={`pf-chatbot__button--attach ${className ?? ''}`}
67
+ className={`pf-chatbot__button--attach ${isCompact ? 'pf-m-compact' : ''} ${className ?? ''}`}
66
68
  aria-label={props['aria-label'] || 'Attach button'}
67
69
  isDisabled={isDisabled}
68
70
  onClick={onClick ?? open}
69
71
  icon={
70
- <Icon iconSize="xl" isInline>
72
+ <Icon iconSize={isCompact ? 'lg' : 'xl'} isInline>
71
73
  <PaperclipIcon />
72
74
  </Icon>
73
75
  }
76
+ size={isCompact ? 'sm' : undefined}
74
77
  {...props}
75
78
  />
76
79
  </Tooltip>
@@ -110,3 +110,20 @@
110
110
  }
111
111
  }
112
112
  }
113
+
114
+ // ============================================================================
115
+ // Information density styles
116
+ // ============================================================================
117
+ .pf-chatbot__message-bar-input.pf-m-compact {
118
+ padding-block-start: 0;
119
+ padding-block-end: 0;
120
+
121
+ .pf-chatbot__message-textarea {
122
+ font-size: var(--pf-t--global--font--size--sm) !important;
123
+ }
124
+
125
+ .pf-chatbot__message-bar-actions {
126
+ padding-block-start: var(--pf-t--global--spacer--md);
127
+ padding-block-end: var(--pf-t--global--spacer--md);
128
+ }
129
+ }
@@ -96,6 +96,12 @@ describe('Message bar', () => {
96
96
  expect(spy).toHaveBeenCalledTimes(1);
97
97
  expect(spy).toHaveBeenCalledWith(expect.any(Object), 'A');
98
98
  });
99
+ it('can use specified placeholder text', async () => {
100
+ render(<MessageBar onSendMessage={jest.fn} placeholder="test placeholder" />);
101
+ const input = screen.getByRole('textbox', { name: /test placeholder/i });
102
+ await userEvent.type(input, 'Hello world');
103
+ expect(input).toHaveTextContent('Hello world');
104
+ });
99
105
 
100
106
  // Send button
101
107
  // --------------------------------------------------------------------------
@@ -304,6 +310,13 @@ describe('Message bar', () => {
304
310
  await userEvent.click(screen.getByRole('button', { name: 'Microphone button' }));
305
311
  expect(screen.getByRole('tooltip', { name: 'Not currently listening' })).toBeTruthy();
306
312
  });
313
+ it('can customize the listening placeholder', async () => {
314
+ mockSpeechRecognition();
315
+ render(<MessageBar onSendMessage={jest.fn} hasMicrophoneButton listeningText="I am listening" />);
316
+ await userEvent.click(screen.getByRole('button', { name: 'Microphone button' }));
317
+ const input = screen.getByRole('textbox', { name: /I am listening/i });
318
+ expect(input).toBeTruthy();
319
+ });
307
320
  it('can handle buttonProps props appropriately for microphone', async () => {
308
321
  mockSpeechRecognition();
309
322
  render(