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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/dist/cjs/AttachMenu/AttachMenu.d.ts +8 -2
  2. package/dist/cjs/AttachMenu/AttachMenu.js +2 -2
  3. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +9 -1
  4. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -2
  5. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +38 -0
  6. package/dist/cjs/ChatbotFooter/ChatbotFooter.d.ts +5 -2
  7. package/dist/cjs/ChatbotFooter/ChatbotFooter.js +2 -2
  8. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +5 -1
  9. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +29 -2
  10. package/dist/cjs/CodeModal/CodeModal.d.ts +2 -0
  11. package/dist/cjs/CodeModal/CodeModal.js +53 -8
  12. package/dist/cjs/DeepThinking/DeepThinking.d.ts +13 -0
  13. package/dist/cjs/DeepThinking/DeepThinking.js +31 -3
  14. package/dist/cjs/DeepThinking/DeepThinking.test.js +80 -0
  15. package/dist/cjs/FileDetailsLabel/FileDetailsLabel.d.ts +2 -1
  16. package/dist/cjs/MarkdownContent/MarkdownContent.d.ts +44 -0
  17. package/dist/cjs/MarkdownContent/MarkdownContent.js +181 -0
  18. package/dist/cjs/MarkdownContent/MarkdownContent.test.d.ts +1 -0
  19. package/dist/cjs/MarkdownContent/MarkdownContent.test.js +192 -0
  20. package/dist/cjs/MarkdownContent/index.d.ts +2 -0
  21. package/dist/cjs/MarkdownContent/index.js +23 -0
  22. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.d.ts +5 -1
  23. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.js +16 -5
  24. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +1 -0
  25. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.js +131 -0
  26. package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
  27. package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +5 -3
  28. package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
  29. package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.js +30 -0
  30. package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +5 -1
  31. package/dist/cjs/Message/LinkMessage/LinkMessage.js +4 -3
  32. package/dist/cjs/Message/ListMessage/OrderedListMessage.d.ts +9 -1
  33. package/dist/cjs/Message/ListMessage/OrderedListMessage.js +2 -1
  34. package/dist/cjs/Message/ListMessage/UnorderedListMessage.d.ts +7 -1
  35. package/dist/cjs/Message/ListMessage/UnorderedListMessage.js +2 -1
  36. package/dist/cjs/Message/Message.d.ts +22 -3
  37. package/dist/cjs/Message/Message.js +8 -161
  38. package/dist/cjs/Message/Message.test.js +161 -2
  39. package/dist/cjs/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
  40. package/dist/cjs/Message/MessageAndActions/MessageAndActions.js +22 -0
  41. package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
  42. package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.js +25 -0
  43. package/dist/cjs/Message/MessageAndActions/index.d.ts +1 -0
  44. package/dist/cjs/Message/MessageAndActions/index.js +17 -0
  45. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
  46. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.js +22 -0
  47. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
  48. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.js +25 -0
  49. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
  50. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.js +22 -0
  51. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
  52. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.js +25 -0
  53. package/dist/cjs/Message/MessageAttachments/index.d.ts +2 -0
  54. package/dist/cjs/Message/MessageAttachments/index.js +18 -0
  55. package/dist/cjs/Message/MessageInput.d.ts +1 -1
  56. package/dist/cjs/Message/MessageInput.js +3 -1
  57. package/dist/cjs/Message/MessageLoading.d.ts +13 -3
  58. package/dist/cjs/Message/MessageLoading.js +19 -5
  59. package/dist/cjs/Message/MessageLoading.test.d.ts +1 -0
  60. package/dist/cjs/Message/MessageLoading.test.js +25 -0
  61. package/dist/cjs/Message/QuickResponse/QuickResponse.js +3 -2
  62. package/dist/cjs/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
  63. package/dist/cjs/Message/QuickResponse/QuickResponse.test.js +109 -0
  64. package/dist/cjs/Message/QuickResponse/index.d.ts +1 -0
  65. package/dist/cjs/Message/QuickResponse/index.js +17 -0
  66. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +1 -1
  67. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +3 -2
  68. package/dist/cjs/Message/QuickStarts/index.d.ts +2 -0
  69. package/dist/cjs/Message/QuickStarts/index.js +18 -0
  70. package/dist/cjs/Message/TableMessage/TableMessage.d.ts +9 -1
  71. package/dist/cjs/Message/TableMessage/TableMessage.js +3 -2
  72. package/dist/cjs/Message/TextMessage/TextMessage.d.ts +11 -1
  73. package/dist/cjs/Message/TextMessage/TextMessage.js +3 -2
  74. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +3 -1
  75. package/dist/cjs/Message/UserFeedback/UserFeedback.js +8 -6
  76. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
  77. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +3 -2
  78. package/dist/cjs/Message/UserFeedback/index.d.ts +2 -0
  79. package/dist/cjs/Message/UserFeedback/index.js +18 -0
  80. package/dist/cjs/Message/index.d.ts +8 -0
  81. package/dist/cjs/Message/index.js +8 -0
  82. package/dist/cjs/MessageBar/AttachButton.d.ts +2 -0
  83. package/dist/cjs/MessageBar/AttachButton.js +2 -2
  84. package/dist/cjs/MessageBar/AttachButton.test.js +4 -0
  85. package/dist/cjs/MessageBar/MessageBar.d.ts +22 -6
  86. package/dist/cjs/MessageBar/MessageBar.js +43 -11
  87. package/dist/cjs/MessageBar/MessageBar.test.js +74 -0
  88. package/dist/cjs/Onboarding/Onboarding.d.ts +36 -0
  89. package/dist/cjs/Onboarding/Onboarding.js +37 -0
  90. package/dist/cjs/Onboarding/Onboarding.test.d.ts +1 -0
  91. package/dist/cjs/Onboarding/Onboarding.test.js +80 -0
  92. package/dist/cjs/Onboarding/index.d.ts +2 -0
  93. package/dist/cjs/Onboarding/index.js +23 -0
  94. package/dist/cjs/ResponseActions/ResponseActions.d.ts +7 -0
  95. package/dist/cjs/ResponseActions/ResponseActions.js +28 -7
  96. package/dist/cjs/ResponseActions/ResponseActions.test.js +67 -12
  97. package/dist/cjs/ResponseActions/ResponseActionsGroups.d.ts +13 -0
  98. package/dist/cjs/ResponseActions/ResponseActionsGroups.js +22 -0
  99. package/dist/cjs/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
  100. package/dist/cjs/ResponseActions/ResponseActionsGroups.test.js +25 -0
  101. package/dist/cjs/ResponseActions/index.d.ts +1 -0
  102. package/dist/cjs/ResponseActions/index.js +1 -0
  103. package/dist/cjs/ToolCall/ToolCall.d.ts +11 -0
  104. package/dist/cjs/ToolCall/ToolCall.js +24 -3
  105. package/dist/cjs/ToolCall/ToolCall.test.js +57 -0
  106. package/dist/cjs/ToolResponse/ToolResponse.d.ts +17 -0
  107. package/dist/cjs/ToolResponse/ToolResponse.js +49 -3
  108. package/dist/cjs/ToolResponse/ToolResponse.test.js +100 -0
  109. package/dist/cjs/__mocks__/monaco-editor.d.ts +11 -0
  110. package/dist/cjs/__mocks__/monaco-editor.js +18 -0
  111. package/dist/cjs/index.d.ts +4 -0
  112. package/dist/cjs/index.js +7 -1
  113. package/dist/css/main.css +336 -30
  114. package/dist/css/main.css.map +1 -1
  115. package/dist/dynamic/MarkdownContent/package.json +1 -0
  116. package/dist/dynamic/Onboarding/package.json +1 -0
  117. package/dist/esm/AttachMenu/AttachMenu.d.ts +8 -2
  118. package/dist/esm/AttachMenu/AttachMenu.js +2 -2
  119. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +9 -1
  120. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +10 -3
  121. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +38 -0
  122. package/dist/esm/ChatbotFooter/ChatbotFooter.d.ts +5 -2
  123. package/dist/esm/ChatbotFooter/ChatbotFooter.js +2 -2
  124. package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +5 -1
  125. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +30 -3
  126. package/dist/esm/CodeModal/CodeModal.d.ts +2 -0
  127. package/dist/esm/CodeModal/CodeModal.js +54 -9
  128. package/dist/esm/DeepThinking/DeepThinking.d.ts +13 -0
  129. package/dist/esm/DeepThinking/DeepThinking.js +28 -3
  130. package/dist/esm/DeepThinking/DeepThinking.test.js +80 -0
  131. package/dist/esm/FileDetailsLabel/FileDetailsLabel.d.ts +2 -1
  132. package/dist/esm/MarkdownContent/MarkdownContent.d.ts +44 -0
  133. package/dist/esm/MarkdownContent/MarkdownContent.js +174 -0
  134. package/dist/esm/MarkdownContent/MarkdownContent.test.d.ts +1 -0
  135. package/dist/esm/MarkdownContent/MarkdownContent.test.js +187 -0
  136. package/dist/esm/MarkdownContent/index.d.ts +2 -0
  137. package/dist/esm/MarkdownContent/index.js +2 -0
  138. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.d.ts +5 -1
  139. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.js +16 -5
  140. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +1 -0
  141. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.js +126 -0
  142. package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
  143. package/dist/esm/Message/ErrorMessage/ErrorMessage.js +3 -3
  144. package/dist/esm/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
  145. package/dist/esm/Message/ErrorMessage/ErrorMessage.test.js +25 -0
  146. package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +5 -1
  147. package/dist/esm/Message/LinkMessage/LinkMessage.js +4 -3
  148. package/dist/esm/Message/ListMessage/OrderedListMessage.d.ts +9 -1
  149. package/dist/esm/Message/ListMessage/OrderedListMessage.js +2 -1
  150. package/dist/esm/Message/ListMessage/UnorderedListMessage.d.ts +7 -1
  151. package/dist/esm/Message/ListMessage/UnorderedListMessage.js +2 -1
  152. package/dist/esm/Message/Message.d.ts +22 -3
  153. package/dist/esm/Message/Message.js +9 -162
  154. package/dist/esm/Message/Message.test.js +161 -2
  155. package/dist/esm/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
  156. package/dist/esm/Message/MessageAndActions/MessageAndActions.js +18 -0
  157. package/dist/esm/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
  158. package/dist/esm/Message/MessageAndActions/MessageAndActions.test.js +20 -0
  159. package/dist/esm/Message/MessageAndActions/index.d.ts +1 -0
  160. package/dist/esm/Message/MessageAndActions/index.js +1 -0
  161. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
  162. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.js +18 -0
  163. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
  164. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.js +20 -0
  165. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
  166. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.js +18 -0
  167. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
  168. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.js +20 -0
  169. package/dist/esm/Message/MessageAttachments/index.d.ts +2 -0
  170. package/dist/esm/Message/MessageAttachments/index.js +2 -0
  171. package/dist/esm/Message/MessageInput.d.ts +1 -1
  172. package/dist/esm/Message/MessageInput.js +1 -1
  173. package/dist/esm/Message/MessageLoading.d.ts +13 -3
  174. package/dist/esm/Message/MessageLoading.js +16 -4
  175. package/dist/esm/Message/MessageLoading.test.d.ts +1 -0
  176. package/dist/esm/Message/MessageLoading.test.js +20 -0
  177. package/dist/esm/Message/QuickResponse/QuickResponse.js +3 -2
  178. package/dist/esm/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
  179. package/dist/esm/Message/QuickResponse/QuickResponse.test.js +104 -0
  180. package/dist/esm/Message/QuickResponse/index.d.ts +1 -0
  181. package/dist/esm/Message/QuickResponse/index.js +1 -0
  182. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +1 -1
  183. package/dist/esm/Message/QuickStarts/QuickStartTile.js +1 -1
  184. package/dist/esm/Message/QuickStarts/index.d.ts +2 -0
  185. package/dist/esm/Message/QuickStarts/index.js +2 -0
  186. package/dist/esm/Message/TableMessage/TableMessage.d.ts +9 -1
  187. package/dist/esm/Message/TableMessage/TableMessage.js +3 -2
  188. package/dist/esm/Message/TextMessage/TextMessage.d.ts +11 -1
  189. package/dist/esm/Message/TextMessage/TextMessage.js +3 -2
  190. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +3 -1
  191. package/dist/esm/Message/UserFeedback/UserFeedback.js +7 -7
  192. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
  193. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +1 -2
  194. package/dist/esm/Message/UserFeedback/index.d.ts +2 -0
  195. package/dist/esm/Message/UserFeedback/index.js +2 -0
  196. package/dist/esm/Message/index.d.ts +8 -0
  197. package/dist/esm/Message/index.js +8 -0
  198. package/dist/esm/MessageBar/AttachButton.d.ts +2 -0
  199. package/dist/esm/MessageBar/AttachButton.js +2 -2
  200. package/dist/esm/MessageBar/AttachButton.test.js +4 -0
  201. package/dist/esm/MessageBar/MessageBar.d.ts +22 -6
  202. package/dist/esm/MessageBar/MessageBar.js +43 -11
  203. package/dist/esm/MessageBar/MessageBar.test.js +74 -0
  204. package/dist/esm/Onboarding/Onboarding.d.ts +36 -0
  205. package/dist/esm/Onboarding/Onboarding.js +30 -0
  206. package/dist/esm/Onboarding/Onboarding.test.d.ts +1 -0
  207. package/dist/esm/Onboarding/Onboarding.test.js +75 -0
  208. package/dist/esm/Onboarding/index.d.ts +2 -0
  209. package/dist/esm/Onboarding/index.js +2 -0
  210. package/dist/esm/ResponseActions/ResponseActions.d.ts +7 -0
  211. package/dist/esm/ResponseActions/ResponseActions.js +28 -7
  212. package/dist/esm/ResponseActions/ResponseActions.test.js +67 -12
  213. package/dist/esm/ResponseActions/ResponseActionsGroups.d.ts +13 -0
  214. package/dist/esm/ResponseActions/ResponseActionsGroups.js +18 -0
  215. package/dist/esm/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
  216. package/dist/esm/ResponseActions/ResponseActionsGroups.test.js +20 -0
  217. package/dist/esm/ResponseActions/index.d.ts +1 -0
  218. package/dist/esm/ResponseActions/index.js +1 -0
  219. package/dist/esm/ToolCall/ToolCall.d.ts +11 -0
  220. package/dist/esm/ToolCall/ToolCall.js +21 -3
  221. package/dist/esm/ToolCall/ToolCall.test.js +57 -0
  222. package/dist/esm/ToolResponse/ToolResponse.d.ts +17 -0
  223. package/dist/esm/ToolResponse/ToolResponse.js +46 -3
  224. package/dist/esm/ToolResponse/ToolResponse.test.js +100 -0
  225. package/dist/esm/__mocks__/monaco-editor.d.ts +11 -0
  226. package/dist/esm/__mocks__/monaco-editor.js +18 -0
  227. package/dist/esm/index.d.ts +4 -0
  228. package/dist/esm/index.js +4 -0
  229. package/dist/tsconfig.tsbuildinfo +1 -1
  230. package/package.json +13 -2
  231. package/patternfly-docs/content/extensions/chatbot/chatbot.md +57 -0
  232. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +12 -12
  233. package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +1 -1
  234. package/patternfly-docs/content/extensions/chatbot/examples/Customizing Messages/Customizing Messages.md +1 -1
  235. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +1 -0
  236. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomStructure.tsx +102 -0
  237. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithDeepThinking.tsx +25 -11
  238. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +14 -1
  239. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownDeepThinking.tsx +26 -0
  240. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownToolCall.tsx +29 -0
  241. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownToolResponse.tsx +200 -0
  242. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMultipleActionGroups.tsx +61 -0
  243. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithPersistedActions.tsx +22 -0
  244. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +11 -0
  245. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolCall.tsx +14 -1
  246. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolResponse.tsx +222 -105
  247. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +123 -14
  248. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +1 -0
  249. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +3 -1
  250. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSearchActions.tsx +198 -0
  251. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarCustomActions.tsx +190 -0
  252. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarIndicatorThinking.tsx +15 -0
  253. package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactOnboarding.tsx +141 -0
  254. package/patternfly-docs/content/extensions/chatbot/examples/UI/Onboarding.tsx +151 -0
  255. package/patternfly-docs/content/extensions/chatbot/examples/UI/RH-Hat-Image.svg +9 -0
  256. package/patternfly-docs/content/extensions/chatbot/examples/UI/Settings.tsx +1 -1
  257. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +81 -30
  258. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +18 -18
  259. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +44 -22
  260. package/patternfly-docs/content/extensions/chatbot/examples/demos/WhiteEmbeddedChatbot.tsx +451 -0
  261. package/patternfly-docs/patternfly-docs.config.js +1 -1
  262. package/patternfly-docs/patternfly-docs.source.js +1 -1
  263. package/src/AttachMenu/AttachMenu.tsx +26 -11
  264. package/src/Chatbot/Chatbot.scss +23 -1
  265. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +43 -0
  266. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +95 -0
  267. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +51 -15
  268. package/src/ChatbotFooter/ChatbotFooter.scss +21 -0
  269. package/src/ChatbotFooter/ChatbotFooter.test.tsx +10 -1
  270. package/src/ChatbotFooter/ChatbotFooter.tsx +10 -3
  271. package/src/ChatbotHeader/ChatbotHeader.scss +19 -0
  272. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +56 -14
  273. package/src/ChatbotModal/ChatbotModal.scss +3 -0
  274. package/src/CodeModal/CodeModal.tsx +72 -23
  275. package/src/DeepThinking/DeepThinking.scss +1 -1
  276. package/src/DeepThinking/DeepThinking.test.tsx +109 -0
  277. package/src/DeepThinking/DeepThinking.tsx +54 -5
  278. package/src/FileDetailsLabel/FileDetailsLabel.tsx +2 -2
  279. package/src/MarkdownContent/MarkdownContent.test.tsx +207 -0
  280. package/src/MarkdownContent/MarkdownContent.tsx +269 -0
  281. package/src/MarkdownContent/index.ts +2 -0
  282. package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +17 -0
  283. package/src/Message/CodeBlockMessage/CodeBlockMessage.test.tsx +171 -0
  284. package/src/Message/CodeBlockMessage/CodeBlockMessage.tsx +21 -5
  285. package/src/Message/ErrorMessage/ErrorMessage.test.tsx +38 -0
  286. package/src/Message/ErrorMessage/ErrorMessage.tsx +17 -2
  287. package/src/Message/LinkMessage/LinkMessage.scss +5 -0
  288. package/src/Message/LinkMessage/LinkMessage.tsx +24 -2
  289. package/src/Message/ListMessage/ListMessage.scss +8 -0
  290. package/src/Message/ListMessage/OrderedListMessage.tsx +16 -2
  291. package/src/Message/ListMessage/UnorderedListMessage.tsx +12 -2
  292. package/src/Message/Message.scss +11 -7
  293. package/src/Message/Message.test.tsx +239 -2
  294. package/src/Message/Message.tsx +133 -241
  295. package/src/Message/MessageAndActions/MessageAndActions.test.tsx +23 -0
  296. package/src/Message/MessageAndActions/MessageAndActions.tsx +22 -0
  297. package/src/Message/MessageAndActions/index.ts +1 -0
  298. package/src/Message/MessageAttachments/MessageAttachmentItem.test.tsx +23 -0
  299. package/src/Message/MessageAttachments/MessageAttachmentItem.tsx +25 -0
  300. package/src/Message/MessageAttachments/MessageAttachmentsContainer.test.tsx +23 -0
  301. package/src/Message/MessageAttachments/MessageAttachmentsContainer.tsx +25 -0
  302. package/src/Message/MessageAttachments/index.ts +2 -0
  303. package/src/Message/MessageInput.tsx +1 -1
  304. package/src/Message/MessageLoading.scss +7 -0
  305. package/src/Message/MessageLoading.test.tsx +23 -0
  306. package/src/Message/MessageLoading.tsx +17 -2
  307. package/src/Message/QuickResponse/QuickResponse.scss +3 -1
  308. package/src/Message/QuickResponse/QuickResponse.test.tsx +131 -0
  309. package/src/Message/QuickResponse/QuickResponse.tsx +3 -2
  310. package/src/Message/QuickResponse/index.ts +1 -0
  311. package/src/Message/QuickStarts/QuickStartTile.tsx +1 -1
  312. package/src/Message/QuickStarts/index.ts +2 -0
  313. package/src/Message/TableMessage/TableMessage.scss +17 -1
  314. package/src/Message/TableMessage/TableMessage.tsx +22 -2
  315. package/src/Message/TextMessage/TextMessage.scss +18 -0
  316. package/src/Message/TextMessage/TextMessage.tsx +39 -3
  317. package/src/Message/UserFeedback/UserFeedback.scss +30 -2
  318. package/src/Message/UserFeedback/UserFeedback.tsx +23 -13
  319. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +1 -4
  320. package/src/Message/UserFeedback/index.ts +2 -0
  321. package/src/Message/index.ts +8 -0
  322. package/src/MessageBar/AttachButton.scss +0 -1
  323. package/src/MessageBar/AttachButton.test.tsx +4 -0
  324. package/src/MessageBar/AttachButton.tsx +4 -1
  325. package/src/MessageBar/MessageBar.scss +66 -6
  326. package/src/MessageBar/MessageBar.test.tsx +129 -1
  327. package/src/MessageBar/MessageBar.tsx +150 -56
  328. package/src/MessageBar/MicrophoneButton.scss +0 -1
  329. package/src/MessageBar/SendButton.scss +0 -1
  330. package/src/MessageBar/StopButton.scss +0 -1
  331. package/src/Onboarding/Onboarding.scss +101 -0
  332. package/src/Onboarding/Onboarding.test.tsx +148 -0
  333. package/src/Onboarding/Onboarding.tsx +126 -0
  334. package/src/Onboarding/index.ts +3 -0
  335. package/src/ResponseActions/ResponseActions.scss +12 -1
  336. package/src/ResponseActions/ResponseActions.test.tsx +111 -12
  337. package/src/ResponseActions/ResponseActions.tsx +44 -10
  338. package/src/ResponseActions/ResponseActionsGroups.test.tsx +23 -0
  339. package/src/ResponseActions/ResponseActionsGroups.tsx +28 -0
  340. package/src/ResponseActions/index.ts +1 -0
  341. package/src/ToolCall/ToolCall.scss +1 -1
  342. package/src/ToolCall/ToolCall.test.tsx +91 -0
  343. package/src/ToolCall/ToolCall.tsx +49 -4
  344. package/src/ToolResponse/ToolResponse.scss +13 -3
  345. package/src/ToolResponse/ToolResponse.test.tsx +119 -0
  346. package/src/ToolResponse/ToolResponse.tsx +82 -7
  347. package/src/__mocks__/monaco-editor.ts +19 -0
  348. package/src/index.ts +6 -0
  349. package/src/main.scss +2 -0
  350. package/tsconfig.json +1 -1
  351. package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +0 -44
@@ -6,6 +6,9 @@
6
6
  padding: var(--pf-t--global--spacer--sm);
7
7
  background-color: var(--pf-t--global--background--color--tertiary--default);
8
8
  border-radius: var(--pf-t--global--border--radius--small);
9
+ // for high contrast support
10
+ border: var(--pf-t--global--border--width--high-contrast--regular) solid
11
+ var(--pf-t--global--border--color--high-contrast);
9
12
 
10
13
  &-dots {
11
14
  position: relative;
@@ -50,4 +53,8 @@
50
53
  background-color: rgba(41, 41, 41, 0.25);
51
54
  }
52
55
  }
56
+
57
+ &.pf-m-primary {
58
+ background-color: var(--pf-t--global--background--color--secondary--default);
59
+ }
53
60
  }
@@ -0,0 +1,23 @@
1
+ import '@testing-library/jest-dom';
2
+ import { render, screen } from '@testing-library/react';
3
+ import MessageLoading from './MessageLoading';
4
+
5
+ test('Renders with pf-chatbot__message-loading class by default', () => {
6
+ render(<MessageLoading data-testid="test-id" />);
7
+ expect(screen.getByTestId('test-id')).toHaveClass('pf-chatbot__message-loading', { exact: true });
8
+ });
9
+
10
+ test('Renders with pf-m-primary class when isPrimary is true', () => {
11
+ render(<MessageLoading data-testid="test-id" isPrimary />);
12
+ expect(screen.getByTestId('test-id')).toHaveClass('pf-chatbot__message-loading pf-m-primary');
13
+ });
14
+
15
+ test('Renders loading word when loadingWord is passed', () => {
16
+ render(<MessageLoading loadingWord="Loading message" />);
17
+ expect(screen.getByText('Loading message')).toBeInTheDocument();
18
+ });
19
+
20
+ test('Spreads additional props', () => {
21
+ render(<MessageLoading data-testid="test-id" id="custom-id" />);
22
+ expect(screen.getByTestId('test-id')).toHaveAttribute('id', 'custom-id');
23
+ });
@@ -2,8 +2,23 @@
2
2
  // Chatbot Main - Message - Processing
3
3
  // ============================================================================
4
4
 
5
- const MessageLoading = ({ loadingWord }) => (
6
- <div className="pf-chatbot__message-loading">
5
+ import { FunctionComponent } from 'react';
6
+ import type { HTMLProps } from 'react';
7
+ import { css } from '@patternfly/react-styles';
8
+
9
+ /**
10
+ * MessageLoading displays a loading animation for messages.
11
+ * Use this component when passing children to Message to show a loading state.
12
+ */
13
+ export interface MessageLoadingProps extends HTMLProps<HTMLDivElement> {
14
+ /** Text announced to screen readers during loading. */
15
+ loadingWord?: string;
16
+ /** Flag indicating whether primary styling is applied */
17
+ isPrimary?: boolean;
18
+ }
19
+
20
+ export const MessageLoading: FunctionComponent<MessageLoadingProps> = ({ loadingWord, isPrimary, ...props }) => (
21
+ <div className={css('pf-chatbot__message-loading', isPrimary && 'pf-m-primary')} {...props}>
7
22
  <span className="pf-chatbot__message-loading-dots">
8
23
  <span className="pf-v6-screen-reader">{loadingWord}</span>
9
24
  </span>
@@ -1,6 +1,8 @@
1
1
  .pf-chatbot__message-quick-response {
2
2
  .pf-v6-c-label {
3
- --pf-v6-c-label--FontSize: var(--pf-t--global--font--size--md);
3
+ &:not(.pf-m-compact) {
4
+ --pf-v6-c-label--FontSize: var(--pf-t--global--font--size--md);
5
+ }
4
6
 
5
7
  @media screen and (min-width: 401px) and (max-width: 600px) {
6
8
  --pf-v6-c-label__text--MaxWidth: 20ch;
@@ -0,0 +1,131 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import '@testing-library/jest-dom';
4
+ import QuickResponse from './QuickResponse';
5
+
6
+ test('Renders with quick responses', () => {
7
+ const quickResponses = [
8
+ { id: '1', content: 'Response 1' },
9
+ { id: '2', content: 'Response 2' },
10
+ { id: '3', content: 'Response 3' }
11
+ ];
12
+ render(<QuickResponse quickResponses={quickResponses} />);
13
+
14
+ expect(screen.getByText('Response 1')).toBeVisible();
15
+ expect(screen.getByText('Response 2')).toBeVisible();
16
+ expect(screen.getByText('Response 3')).toBeVisible();
17
+ });
18
+
19
+ test('Renders with compact styling', () => {
20
+ const quickResponses = [{ id: '1', content: 'Compact response' }];
21
+ render(<QuickResponse quickResponses={quickResponses} isCompact />);
22
+
23
+ expect(screen.getByText('Compact response').closest('.pf-v6-c-label')).toHaveClass('pf-m-compact');
24
+ });
25
+
26
+ test('Renders with custom className on response', () => {
27
+ const quickResponses = [{ id: '1', content: 'Custom class response', className: 'custom-response-class' }];
28
+ render(<QuickResponse quickResponses={quickResponses} />);
29
+
30
+ expect(screen.getByText('Custom class response').closest('.pf-v6-c-label')).toHaveClass('custom-response-class');
31
+ });
32
+
33
+ test('Renders with custom container className', () => {
34
+ const quickResponses = [
35
+ { id: '1', content: 'Response 1' },
36
+ { id: '2', content: 'Response 2' }
37
+ ];
38
+ render(
39
+ <QuickResponse
40
+ quickResponses={quickResponses}
41
+ quickResponseContainerProps={{ className: 'custom-container-class' }}
42
+ />
43
+ );
44
+
45
+ expect(screen.getByText('Response 1').closest('.pf-v6-c-label-group')).toHaveClass('custom-container-class');
46
+ });
47
+
48
+ test('Spreads additional custom container props', () => {
49
+ const quickResponses = [
50
+ { id: '1', content: 'Response 1' },
51
+ { id: '2', content: 'Response 2' }
52
+ ];
53
+ render(<QuickResponse quickResponses={quickResponses} quickResponseContainerProps={{ id: 'custom-container-id' }} />);
54
+
55
+ expect(screen.getByText('Response 1').closest('.pf-v6-c-label-group__list')).toHaveAttribute(
56
+ 'id',
57
+ 'custom-container-id'
58
+ );
59
+ });
60
+
61
+ test('Renders with pf-chatbot__message-quick-response--selected class after click', async () => {
62
+ const user = userEvent.setup();
63
+ const quickResponses = [
64
+ { id: '1', content: 'Response 1' },
65
+ { id: '2', content: 'Response 2' }
66
+ ];
67
+ render(<QuickResponse quickResponses={quickResponses} />);
68
+
69
+ await user.click(screen.getByText('Response 1'));
70
+
71
+ expect(screen.getByText('Response 1').closest('.pf-v6-c-label')).toHaveClass(
72
+ 'pf-chatbot__message-quick-response--selected'
73
+ );
74
+ });
75
+
76
+ test('Does not calls onClick handler when not passed', async () => {
77
+ const user = userEvent.setup();
78
+ const handleClick = jest.fn();
79
+ const quickResponses = [{ id: '1', content: 'Clickable response' }];
80
+ render(<QuickResponse quickResponses={quickResponses} />);
81
+
82
+ await user.click(screen.getByText('Clickable response'));
83
+
84
+ expect(handleClick).not.toHaveBeenCalled();
85
+ });
86
+
87
+ test('Calls onClick handler when passed', async () => {
88
+ const user = userEvent.setup();
89
+ const handleClick = jest.fn();
90
+ const quickResponses = [{ id: '1', content: 'Clickable response', onClick: handleClick }];
91
+ render(<QuickResponse quickResponses={quickResponses} />);
92
+
93
+ await user.click(screen.getByText('Clickable response'));
94
+
95
+ expect(handleClick).toHaveBeenCalled();
96
+ });
97
+
98
+ test('Does not call onSelect when not passed', async () => {
99
+ const user = userEvent.setup();
100
+ const handleSelect = jest.fn();
101
+ const quickResponses = [
102
+ { id: '1', content: 'Response 1' },
103
+ { id: '2', content: 'Response 2' }
104
+ ];
105
+ render(<QuickResponse quickResponses={quickResponses} />);
106
+
107
+ await user.click(screen.getByText('Response 2'));
108
+
109
+ expect(handleSelect).not.toHaveBeenCalled();
110
+ });
111
+
112
+ test('Calls onSelect when passed', async () => {
113
+ const user = userEvent.setup();
114
+ const handleSelect = jest.fn();
115
+ const quickResponses = [
116
+ { id: '1', content: 'Response 1' },
117
+ { id: '2', content: 'Response 2' }
118
+ ];
119
+ render(<QuickResponse quickResponses={quickResponses} onSelect={handleSelect} />);
120
+
121
+ await user.click(screen.getByText('Response 2'));
122
+
123
+ expect(handleSelect).toHaveBeenCalledWith('2');
124
+ });
125
+
126
+ test('Spreads additional response props', () => {
127
+ const quickResponses = [{ id: '1', content: 'Response with props', isCompact: true, 'aria-label': 'Test label' }];
128
+ render(<QuickResponse quickResponses={quickResponses} />);
129
+
130
+ expect(screen.getByText('Response with props').closest('.pf-v6-c-label')).toHaveAttribute('aria-label', 'Test label');
131
+ });
@@ -2,6 +2,7 @@ import type { FunctionComponent } from 'react';
2
2
  import { useState } from 'react';
3
3
  import { Label, LabelGroup, LabelGroupProps, LabelProps } from '@patternfly/react-core';
4
4
  import { CheckIcon } from '@patternfly/react-icons';
5
+ import { css } from '@patternfly/react-styles';
5
6
 
6
7
  export interface QuickResponse extends Omit<LabelProps, 'children'> {
7
8
  content: string;
@@ -35,7 +36,7 @@ export const QuickResponse: FunctionComponent<QuickResponseProps> = ({
35
36
  };
36
37
  return (
37
38
  <LabelGroup
38
- className={`pf-chatbot__message-quick-response ${quickResponseContainerProps?.className ? quickResponseContainerProps?.className : ''}`}
39
+ className={css('pf-chatbot__message-quick-response', quickResponseContainerProps?.className)}
39
40
  {...quickResponseContainerProps}
40
41
  >
41
42
  {quickResponses.map(({ id, onClick, content, className, ...props }: QuickResponse) => (
@@ -45,7 +46,7 @@ export const QuickResponse: FunctionComponent<QuickResponseProps> = ({
45
46
  color="blue"
46
47
  key={id}
47
48
  onClick={() => handleQuickResponseClick(id, onClick)}
48
- className={`${id === selectedQuickResponse ? 'pf-chatbot__message-quick-response--selected' : ''} ${className ? className : ''}`}
49
+ className={css(id === selectedQuickResponse && 'pf-chatbot__message-quick-response--selected', className)}
49
50
  isCompact={isCompact}
50
51
  {...props}
51
52
  >
@@ -0,0 +1 @@
1
+ export * from './QuickResponse';
@@ -53,7 +53,7 @@ export interface QuickStartTileProps {
53
53
  isCompact?: boolean;
54
54
  }
55
55
 
56
- const QuickStartTile: FC<QuickStartTileProps> = ({
56
+ export const QuickStartTile: FC<QuickStartTileProps> = ({
57
57
  className,
58
58
  quickStart,
59
59
  onClick,
@@ -0,0 +1,2 @@
1
+ export * from './QuickStartTile';
2
+ export * from './types';
@@ -1,13 +1,18 @@
1
1
  .pf-chatbot__message-table {
2
2
  border-radius: var(--pf-t--global--border--radius--small);
3
3
  --pf-v6-c-table--BackgroundColor: var(--pf-t--global--background--color--tertiary--default) !important;
4
- --pf-v6-c-table--BorderColor: var(--pf-t--global--border--color--default) !important;
4
+ border: var(--pf-t--global--border--width--high-contrast--regular) solid
5
+ var(--pf-t--global--border--color--high-contrast) !important;
5
6
  padding: 0 var(--pf-t--global--spacer--lg) 0 var(--pf-t--global--spacer--lg);
6
7
 
7
8
  &.pf-m-grid.pf-v6-c-table tbody:where(.pf-v6-c-table__tbody):first-of-type {
8
9
  border-block-start: 0;
9
10
  }
10
11
 
12
+ &.pf-m-primary {
13
+ --pf-v6-c-table--BackgroundColor: var(--pf-t--global--background--color--secondary--default) !important;
14
+ }
15
+
11
16
  tbody {
12
17
  border-radius: var(--pf-t--global--border--radius--small);
13
18
  }
@@ -20,4 +25,15 @@
20
25
  .pf-v6-c-table__tr:last-of-type {
21
26
  border-block-end: 0;
22
27
  }
28
+
29
+ &.pf-m-markdown {
30
+ table,
31
+ tbody,
32
+ td,
33
+ thead,
34
+ th,
35
+ tr {
36
+ font-size: inherit;
37
+ }
38
+ }
23
39
  }
@@ -5,6 +5,7 @@
5
5
  import { Children, cloneElement } from 'react';
6
6
  import { ExtraProps } from 'react-markdown';
7
7
  import { Table, TableProps } from '@patternfly/react-table';
8
+ import { css } from '@patternfly/react-styles';
8
9
 
9
10
  interface Properties {
10
11
  line: number;
@@ -19,7 +20,21 @@ export interface TableNode {
19
20
  type: string;
20
21
  }
21
22
 
22
- const TableMessage = ({ children, ...props }: Omit<TableProps, 'ref'> & ExtraProps) => {
23
+ export interface TableMessageProps {
24
+ /** Content of the table */
25
+ children?: React.ReactNode;
26
+ /** Flag indicating whether primary styles should be applied. */
27
+ isPrimary?: boolean;
28
+ /** Flag indicating that the content should retain message styles when using Markdown. */
29
+ shouldRetainStyles?: boolean;
30
+ }
31
+
32
+ const TableMessage = ({
33
+ children,
34
+ isPrimary,
35
+ shouldRetainStyles,
36
+ ...props
37
+ }: Omit<TableProps, 'ref'> & ExtraProps & TableMessageProps) => {
23
38
  const { className, ...rest } = props;
24
39
 
25
40
  // This allows us to parse the nested data we get back from the 3rd party Markdown parser
@@ -72,7 +87,12 @@ const TableMessage = ({ children, ...props }: Omit<TableProps, 'ref'> & ExtraPro
72
87
  <Table
73
88
  aria-label={props['aria-label']}
74
89
  gridBreakPoint="grid"
75
- className={`pf-chatbot__message-table ${className ? className : ''}`}
90
+ className={css(
91
+ 'pf-chatbot__message-table',
92
+ isPrimary && 'pf-m-primary',
93
+ shouldRetainStyles && 'pf-m-markdown',
94
+ className
95
+ )}
76
96
  {...rest}
77
97
  >
78
98
  {modifyChildren(children)}
@@ -47,6 +47,20 @@
47
47
  white-space: nowrap;
48
48
  width: 1px;
49
49
  }
50
+
51
+ &.pf-m-primary {
52
+ code {
53
+ background-color: var(--pf-t--global--background--color--secondary--default);
54
+ }
55
+ }
56
+
57
+ &.pf-m-markdown {
58
+ display: block;
59
+ }
60
+ &.pf-m-markdown > [class^='pf-v6-c-content'] {
61
+ font-size: inherit;
62
+ color: inherit;
63
+ }
50
64
  }
51
65
 
52
66
  // ============================================================================
@@ -96,6 +110,10 @@ li[id*='user-content-fn-']:has(> span > span > .pf-chatbot__message-text + .pf-c
96
110
  }
97
111
  }
98
112
 
113
+ blockquote {
114
+ border-inline-start-color: var(--pf-t--global--border--color--alt);
115
+ }
116
+
99
117
  .pf-chatbot__message-text > .pf-chatbot__message-text {
100
118
  background-color: initial;
101
119
  padding: initial;
@@ -4,10 +4,46 @@
4
4
 
5
5
  import { ExtraProps } from 'react-markdown';
6
6
  import { Content, ContentProps } from '@patternfly/react-core';
7
+ import { css } from '@patternfly/react-styles';
7
8
 
8
- const TextMessage = ({ component, children, ...props }: Omit<ContentProps, 'ref'> & ExtraProps) => (
9
- <span className="pf-chatbot__message-text">
10
- <Content component={component} {...props}>
9
+ export interface TextMessageProps {
10
+ /** The text message content */
11
+ children?: React.ReactNode;
12
+ /** Flag indicating whether primary styling is applied. */
13
+ isPrimary?: boolean;
14
+ /** The wrapper component to use for the PatternFly Content component. Defaults to a div. */
15
+ component?:
16
+ | 'h1'
17
+ | 'h2'
18
+ | 'h3'
19
+ | 'h4'
20
+ | 'h5'
21
+ | 'h6'
22
+ | 'p'
23
+ | 'a'
24
+ | 'small'
25
+ | 'blockquote'
26
+ | 'pre'
27
+ | 'hr'
28
+ | 'ul'
29
+ | 'ol'
30
+ | 'dl'
31
+ | 'li'
32
+ | 'dt'
33
+ | 'dd';
34
+ /** Flag indicating that the content should retain message styles when using Markdown. */
35
+ shouldRetainStyles?: boolean;
36
+ }
37
+
38
+ const TextMessage = ({
39
+ component,
40
+ children,
41
+ isPrimary,
42
+ shouldRetainStyles,
43
+ ...props
44
+ }: Omit<ContentProps, 'ref'> & ExtraProps & TextMessageProps) => (
45
+ <span className={css('pf-chatbot__message-text', isPrimary && 'pf-m-primary', shouldRetainStyles && 'pf-m-markdown')}>
46
+ <Content component={component} {...props} className={css(props?.className)}>
11
47
  {children}
12
48
  </Content>
13
49
  </span>
@@ -1,7 +1,8 @@
1
1
  // shared
2
2
  .pf-chatbot__feedback-card {
3
3
  box-shadow: var(--pf-t--global--box-shadow--sm);
4
- --pf-v6-c-card--BorderWidth: 0;
4
+ // we want to override to 0 usually and assume the default border for high contrast support
5
+ --pf-v6-c-card--BorderWidth: var(--pf-t--global--border--width--high-contrast--regular);
5
6
  max-width: 27.5rem; // fixme address mobile vs desktop
6
7
  }
7
8
 
@@ -35,6 +36,11 @@
35
36
  }
36
37
 
37
38
  // feedback card
39
+ .pf-chatbot__feedback-card-complete-header {
40
+ .pf-v6-c-card__actions {
41
+ --pf-v6-c-card__actions--MarginBlockEnd: calc(var(--pf-t--global--spacer--xl) * -1);
42
+ }
43
+ }
38
44
  .pf-chatbot__feedback-card-title {
39
45
  font-family: var(--pf-t--global--font--family--heading);
40
46
  font-size: var(--pf-t--global--font--size--md);
@@ -50,10 +56,32 @@
50
56
  font-weight: initial;
51
57
  }
52
58
 
59
+ // Privacy statement
60
+ .pf-chatbot__feedback-card-privacy {
61
+ font-size: var(--pf-t--global--font--size--body--sm);
62
+ font-weight: var(--pf-t--global--font--weight--body--default);
63
+ line-height: var(--pf-t--global--font--line-height--body);
64
+ color: var(--pf-t--global--text--color--subtle);
65
+ }
66
+
53
67
  // Compact styles
54
68
  .pf-v6-c-card.pf-m-compact.pf-chatbot__feedback-card {
69
+ --pf-v6-c-card--first-child--PaddingBlockStart: var(--pf-t--global--spacer--md);
70
+ --pf-v6-c-card--child--PaddingInlineEnd: var(--pf-t--global--spacer--md);
71
+ --pf-v6-c-card--child--PaddingInlineStart: var(--pf-t--global--spacer--md);
72
+ --pf-v6-c-card--last-child--PaddingBlockEnd: var(--pf-t--global--spacer--md);
73
+ --pf-v6-c-card__title--not--last-child--PaddingBlockEnd: var(--pf-t--global--spacer--md);
74
+
55
75
  .pf-chatbot__feedback-card-form.pf-m-compact {
56
- --pf-v6-c-form--GridGap: var(--pf-t--global--spacer--md);
76
+ --pf-v6-c-form--GridGap: var(--pf-t--global--spacer--sm);
77
+
78
+ .pf-v6-c-form__group.pf-m-action {
79
+ margin-block-start: var(--pf-t--global--spacer--sm);
80
+ }
81
+
82
+ .pf-v6-c-form-control {
83
+ font-size: var(--pf-t--global--font--size--body--sm);
84
+ }
57
85
  }
58
86
  }
59
87
 
@@ -74,9 +74,11 @@ export interface UserFeedbackProps extends Omit<CardProps, 'onSubmit'>, OUIAProp
74
74
  textAreaProps?: TextAreaProps;
75
75
  /** Additional props passed to action group */
76
76
  actionGroupProps?: ActionGroupProps;
77
+ /** Optional privacy statement text displayed under text area */
78
+ privacyStatement?: string;
77
79
  }
78
80
 
79
- const UserFeedback: FunctionComponent<UserFeedbackProps> = ({
81
+ export const UserFeedback: FunctionComponent<UserFeedbackProps> = ({
80
82
  className,
81
83
  timestamp,
82
84
  title = 'Why did you choose this rating?',
@@ -102,6 +104,7 @@ const UserFeedback: FunctionComponent<UserFeedbackProps> = ({
102
104
  textAreaProps,
103
105
  actionGroupProps,
104
106
  submitButtonProps,
107
+ privacyStatement,
105
108
  ...props
106
109
  }: UserFeedbackProps) => {
107
110
  const [selectedResponse, setSelectedResponse] = useState<string>();
@@ -139,21 +142,28 @@ const UserFeedback: FunctionComponent<UserFeedbackProps> = ({
139
142
  />
140
143
  )}
141
144
  {hasTextArea && (
142
- <TextArea
143
- value={value}
144
- onChange={(_event, value) => {
145
- setValue(value);
146
- onTextAreaChange && onTextAreaChange(_event, value);
147
- }}
148
- placeholder={textAreaPlaceholder}
149
- aria-label={textAreaAriaLabel}
150
- resizeOrientation="vertical"
151
- {...textAreaProps}
152
- />
145
+ <>
146
+ <TextArea
147
+ value={value}
148
+ onChange={(_event, value) => {
149
+ setValue(value);
150
+ onTextAreaChange && onTextAreaChange(_event, value);
151
+ }}
152
+ placeholder={textAreaPlaceholder}
153
+ aria-label={textAreaAriaLabel}
154
+ resizeOrientation="vertical"
155
+ {...textAreaProps}
156
+ />
157
+ </>
153
158
  )}
159
+ {privacyStatement && <div className="pf-chatbot__feedback-card-privacy">{privacyStatement}</div>}
154
160
  {children}
155
161
  <ActionGroup {...actionGroupProps}>
156
- <Button onClick={() => onSubmit(selectedResponse, value)} {...submitButtonProps}>
162
+ <Button
163
+ onClick={() => onSubmit(selectedResponse, value)}
164
+ size={isCompact ? 'sm' : undefined}
165
+ {...submitButtonProps}
166
+ >
157
167
  {submitWord}
158
168
  </Button>
159
169
  </ActionGroup>
@@ -2,10 +2,7 @@
2
2
  // Chatbot Main - Messages - Feedback Complete Card
3
3
  // ============================================================================
4
4
  import type { MouseEvent as ReactMouseEvent, FunctionComponent } from 'react';
5
-
6
5
  import { useState, useRef, useEffect } from 'react';
7
-
8
- // Import PatternFly components
9
6
  import { Card, CardBody, CardHeader, CardProps, CardTitle, OUIAProps, useOUIAProps } from '@patternfly/react-core';
10
7
  import CloseButton from './CloseButton';
11
8
 
@@ -48,7 +45,7 @@ export interface UserFeedbackCompleteProps extends Omit<CardProps, 'ref'>, OUIAP
48
45
  timestamp?: string;
49
46
  }
50
47
 
51
- const UserFeedbackComplete: FunctionComponent<UserFeedbackCompleteProps> = ({
48
+ export const UserFeedbackComplete: FunctionComponent<UserFeedbackCompleteProps> = ({
52
49
  className,
53
50
  title = 'Feedback submitted',
54
51
  body = "We've received your response. Thank you for sharing your feedback!",
@@ -0,0 +1,2 @@
1
+ export * from './UserFeedback';
2
+ export * from './UserFeedbackComplete';
@@ -1,4 +1,12 @@
1
1
  export { default } from './Message';
2
2
  export { rehypeCodeBlockToggle } from './Plugins/rehypeCodeBlockToggle';
3
3
 
4
+ export * from './ErrorMessage/ErrorMessage';
5
+ export * from './MessageAndActions';
6
+ export * from './MessageAttachments';
4
7
  export * from './Message';
8
+ export * from './MessageLoading';
9
+ export * from './MessageInput';
10
+ export * from './QuickResponse';
11
+ export * from './QuickStarts';
12
+ export * from './UserFeedback';
@@ -41,6 +41,5 @@
41
41
  .pf-v6-c-button.pf-chatbot__button--attach.pf-m-compact {
42
42
  width: 1.5rem;
43
43
  height: 1.5rem;
44
- padding: var(--pf-t--global--spacer--sm);
45
44
  align-items: center;
46
45
  }
@@ -173,4 +173,8 @@ describe('Attach button', () => {
173
173
  expect(validator).toHaveBeenCalledWith(file);
174
174
  expect(onAttachRejected).toHaveBeenCalled();
175
175
  });
176
+ it('should handle icon prop', () => {
177
+ render(<AttachButton icon={<img alt="" src="" />} />);
178
+ expect(screen.getByRole('img')).toBeVisible();
179
+ });
176
180
  });
@@ -51,6 +51,8 @@ export interface AttachButtonProps extends ButtonProps {
51
51
  validator?: <T extends File>(file: T) => FileError | readonly FileError[] | null;
52
52
  /** Additional props passed to react-dropzone */
53
53
  dropzoneProps?: DropzoneOptions;
54
+ /** Icon displayed in attach button */
55
+ icon?: React.ReactNode;
54
56
  }
55
57
 
56
58
  const AttachButtonBase: FunctionComponent<AttachButtonProps> = ({
@@ -72,6 +74,7 @@ const AttachButtonBase: FunctionComponent<AttachButtonProps> = ({
72
74
  onAttachRejected,
73
75
  validator,
74
76
  dropzoneProps,
77
+ icon = <PaperclipIcon />,
75
78
  ...props
76
79
  }: AttachButtonProps) => {
77
80
  const { open, getInputProps } = useDropzone({
@@ -113,7 +116,7 @@ const AttachButtonBase: FunctionComponent<AttachButtonProps> = ({
113
116
  onClick={onClick ?? open}
114
117
  icon={
115
118
  <Icon iconSize={isCompact ? 'lg' : 'xl'} isInline>
116
- <PaperclipIcon />
119
+ {icon}
117
120
  </Icon>
118
121
  }
119
122
  size={isCompact ? 'sm' : undefined}