@patternfly/chatbot 6.5.0-prerelease.9 → 6.6.0-prerelease.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +9 -1
  2. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -2
  3. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +38 -0
  4. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +29 -2
  5. package/dist/cjs/CodeModal/CodeModal.d.ts +2 -0
  6. package/dist/cjs/CodeModal/CodeModal.js +53 -12
  7. package/dist/cjs/DeepThinking/DeepThinking.d.ts +13 -0
  8. package/dist/cjs/DeepThinking/DeepThinking.js +31 -3
  9. package/dist/cjs/DeepThinking/DeepThinking.test.js +80 -0
  10. package/dist/cjs/MarkdownContent/MarkdownContent.d.ts +44 -0
  11. package/dist/cjs/MarkdownContent/MarkdownContent.js +181 -0
  12. package/dist/cjs/MarkdownContent/MarkdownContent.test.d.ts +1 -0
  13. package/dist/cjs/MarkdownContent/MarkdownContent.test.js +192 -0
  14. package/dist/cjs/MarkdownContent/index.d.ts +2 -0
  15. package/dist/cjs/MarkdownContent/index.js +23 -0
  16. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.d.ts +3 -1
  17. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.js +15 -4
  18. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +1 -0
  19. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.js +131 -0
  20. package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
  21. package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +5 -3
  22. package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
  23. package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.js +30 -0
  24. package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +5 -1
  25. package/dist/cjs/Message/LinkMessage/LinkMessage.js +4 -3
  26. package/dist/cjs/Message/ListMessage/OrderedListMessage.d.ts +9 -1
  27. package/dist/cjs/Message/ListMessage/OrderedListMessage.js +2 -1
  28. package/dist/cjs/Message/ListMessage/UnorderedListMessage.d.ts +7 -1
  29. package/dist/cjs/Message/ListMessage/UnorderedListMessage.js +2 -1
  30. package/dist/cjs/Message/Message.d.ts +20 -3
  31. package/dist/cjs/Message/Message.js +7 -160
  32. package/dist/cjs/Message/Message.test.js +129 -2
  33. package/dist/cjs/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
  34. package/dist/cjs/Message/MessageAndActions/MessageAndActions.js +22 -0
  35. package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
  36. package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.js +25 -0
  37. package/dist/cjs/Message/MessageAndActions/index.d.ts +1 -0
  38. package/dist/cjs/Message/MessageAndActions/index.js +17 -0
  39. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
  40. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.js +22 -0
  41. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
  42. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.js +25 -0
  43. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
  44. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.js +22 -0
  45. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
  46. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.js +25 -0
  47. package/dist/cjs/Message/MessageAttachments/index.d.ts +2 -0
  48. package/dist/cjs/Message/MessageAttachments/index.js +18 -0
  49. package/dist/cjs/Message/MessageInput.d.ts +1 -1
  50. package/dist/cjs/Message/MessageInput.js +3 -1
  51. package/dist/cjs/Message/MessageLoading.d.ts +13 -4
  52. package/dist/cjs/Message/MessageLoading.js +19 -5
  53. package/dist/cjs/Message/MessageLoading.test.d.ts +1 -0
  54. package/dist/cjs/Message/MessageLoading.test.js +25 -0
  55. package/dist/cjs/Message/QuickResponse/QuickResponse.js +3 -2
  56. package/dist/cjs/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
  57. package/dist/cjs/Message/QuickResponse/QuickResponse.test.js +109 -0
  58. package/dist/cjs/Message/QuickResponse/index.d.ts +1 -0
  59. package/dist/cjs/Message/QuickResponse/index.js +17 -0
  60. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +1 -1
  61. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +3 -2
  62. package/dist/cjs/Message/QuickStarts/index.d.ts +2 -0
  63. package/dist/cjs/Message/QuickStarts/index.js +18 -0
  64. package/dist/cjs/Message/TableMessage/TableMessage.d.ts +6 -1
  65. package/dist/cjs/Message/TableMessage/TableMessage.js +3 -2
  66. package/dist/cjs/Message/TextMessage/TextMessage.d.ts +8 -1
  67. package/dist/cjs/Message/TextMessage/TextMessage.js +3 -2
  68. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +3 -1
  69. package/dist/cjs/Message/UserFeedback/UserFeedback.js +8 -6
  70. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
  71. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +3 -2
  72. package/dist/cjs/Message/UserFeedback/index.d.ts +2 -0
  73. package/dist/cjs/Message/UserFeedback/index.js +18 -0
  74. package/dist/cjs/Message/index.d.ts +8 -0
  75. package/dist/cjs/Message/index.js +8 -0
  76. package/dist/cjs/MessageBar/MessageBar.d.ts +10 -0
  77. package/dist/cjs/MessageBar/MessageBar.js +42 -10
  78. package/dist/cjs/MessageBar/MessageBar.test.js +20 -0
  79. package/dist/cjs/Onboarding/Onboarding.d.ts +36 -0
  80. package/dist/cjs/Onboarding/Onboarding.js +37 -0
  81. package/dist/cjs/Onboarding/Onboarding.test.d.ts +1 -0
  82. package/dist/cjs/Onboarding/Onboarding.test.js +80 -0
  83. package/dist/cjs/Onboarding/index.d.ts +2 -0
  84. package/dist/cjs/Onboarding/index.js +23 -0
  85. package/dist/cjs/ResponseActions/ResponseActions.d.ts +7 -0
  86. package/dist/cjs/ResponseActions/ResponseActions.js +28 -7
  87. package/dist/cjs/ResponseActions/ResponseActions.test.js +67 -12
  88. package/dist/cjs/ResponseActions/ResponseActionsGroups.d.ts +13 -0
  89. package/dist/cjs/ResponseActions/ResponseActionsGroups.js +22 -0
  90. package/dist/cjs/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
  91. package/dist/cjs/ResponseActions/ResponseActionsGroups.test.js +25 -0
  92. package/dist/cjs/ResponseActions/index.d.ts +1 -0
  93. package/dist/cjs/ResponseActions/index.js +1 -0
  94. package/dist/cjs/ToolCall/ToolCall.d.ts +11 -0
  95. package/dist/cjs/ToolCall/ToolCall.js +24 -3
  96. package/dist/cjs/ToolCall/ToolCall.test.js +57 -0
  97. package/dist/cjs/ToolResponse/ToolResponse.d.ts +17 -0
  98. package/dist/cjs/ToolResponse/ToolResponse.js +49 -3
  99. package/dist/cjs/ToolResponse/ToolResponse.test.js +100 -0
  100. package/dist/cjs/index.d.ts +4 -0
  101. package/dist/cjs/index.js +7 -1
  102. package/dist/css/main.css +276 -30
  103. package/dist/css/main.css.map +1 -1
  104. package/dist/dynamic/MarkdownContent/package.json +1 -0
  105. package/dist/dynamic/Onboarding/package.json +1 -0
  106. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +9 -1
  107. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +10 -3
  108. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +38 -0
  109. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +30 -3
  110. package/dist/esm/CodeModal/CodeModal.d.ts +2 -0
  111. package/dist/esm/CodeModal/CodeModal.js +54 -13
  112. package/dist/esm/DeepThinking/DeepThinking.d.ts +13 -0
  113. package/dist/esm/DeepThinking/DeepThinking.js +28 -3
  114. package/dist/esm/DeepThinking/DeepThinking.test.js +80 -0
  115. package/dist/esm/MarkdownContent/MarkdownContent.d.ts +44 -0
  116. package/dist/esm/MarkdownContent/MarkdownContent.js +174 -0
  117. package/dist/esm/MarkdownContent/MarkdownContent.test.d.ts +1 -0
  118. package/dist/esm/MarkdownContent/MarkdownContent.test.js +187 -0
  119. package/dist/esm/MarkdownContent/index.d.ts +2 -0
  120. package/dist/esm/MarkdownContent/index.js +2 -0
  121. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.d.ts +3 -1
  122. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.js +15 -4
  123. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +1 -0
  124. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.js +126 -0
  125. package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
  126. package/dist/esm/Message/ErrorMessage/ErrorMessage.js +3 -3
  127. package/dist/esm/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
  128. package/dist/esm/Message/ErrorMessage/ErrorMessage.test.js +25 -0
  129. package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +5 -1
  130. package/dist/esm/Message/LinkMessage/LinkMessage.js +4 -3
  131. package/dist/esm/Message/ListMessage/OrderedListMessage.d.ts +9 -1
  132. package/dist/esm/Message/ListMessage/OrderedListMessage.js +2 -1
  133. package/dist/esm/Message/ListMessage/UnorderedListMessage.d.ts +7 -1
  134. package/dist/esm/Message/ListMessage/UnorderedListMessage.js +2 -1
  135. package/dist/esm/Message/Message.d.ts +20 -3
  136. package/dist/esm/Message/Message.js +8 -161
  137. package/dist/esm/Message/Message.test.js +129 -2
  138. package/dist/esm/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
  139. package/dist/esm/Message/MessageAndActions/MessageAndActions.js +18 -0
  140. package/dist/esm/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
  141. package/dist/esm/Message/MessageAndActions/MessageAndActions.test.js +20 -0
  142. package/dist/esm/Message/MessageAndActions/index.d.ts +1 -0
  143. package/dist/esm/Message/MessageAndActions/index.js +1 -0
  144. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
  145. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.js +18 -0
  146. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
  147. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.js +20 -0
  148. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
  149. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.js +18 -0
  150. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
  151. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.js +20 -0
  152. package/dist/esm/Message/MessageAttachments/index.d.ts +2 -0
  153. package/dist/esm/Message/MessageAttachments/index.js +2 -0
  154. package/dist/esm/Message/MessageInput.d.ts +1 -1
  155. package/dist/esm/Message/MessageInput.js +1 -1
  156. package/dist/esm/Message/MessageLoading.d.ts +13 -4
  157. package/dist/esm/Message/MessageLoading.js +16 -4
  158. package/dist/esm/Message/MessageLoading.test.d.ts +1 -0
  159. package/dist/esm/Message/MessageLoading.test.js +20 -0
  160. package/dist/esm/Message/QuickResponse/QuickResponse.js +3 -2
  161. package/dist/esm/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
  162. package/dist/esm/Message/QuickResponse/QuickResponse.test.js +104 -0
  163. package/dist/esm/Message/QuickResponse/index.d.ts +1 -0
  164. package/dist/esm/Message/QuickResponse/index.js +1 -0
  165. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +1 -1
  166. package/dist/esm/Message/QuickStarts/QuickStartTile.js +1 -1
  167. package/dist/esm/Message/QuickStarts/index.d.ts +2 -0
  168. package/dist/esm/Message/QuickStarts/index.js +2 -0
  169. package/dist/esm/Message/TableMessage/TableMessage.d.ts +6 -1
  170. package/dist/esm/Message/TableMessage/TableMessage.js +3 -2
  171. package/dist/esm/Message/TextMessage/TextMessage.d.ts +8 -1
  172. package/dist/esm/Message/TextMessage/TextMessage.js +3 -2
  173. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +3 -1
  174. package/dist/esm/Message/UserFeedback/UserFeedback.js +7 -7
  175. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
  176. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +1 -2
  177. package/dist/esm/Message/UserFeedback/index.d.ts +2 -0
  178. package/dist/esm/Message/UserFeedback/index.js +2 -0
  179. package/dist/esm/Message/index.d.ts +8 -0
  180. package/dist/esm/Message/index.js +8 -0
  181. package/dist/esm/MessageBar/MessageBar.d.ts +10 -0
  182. package/dist/esm/MessageBar/MessageBar.js +42 -10
  183. package/dist/esm/MessageBar/MessageBar.test.js +20 -0
  184. package/dist/esm/Onboarding/Onboarding.d.ts +36 -0
  185. package/dist/esm/Onboarding/Onboarding.js +30 -0
  186. package/dist/esm/Onboarding/Onboarding.test.d.ts +1 -0
  187. package/dist/esm/Onboarding/Onboarding.test.js +75 -0
  188. package/dist/esm/Onboarding/index.d.ts +2 -0
  189. package/dist/esm/Onboarding/index.js +2 -0
  190. package/dist/esm/ResponseActions/ResponseActions.d.ts +7 -0
  191. package/dist/esm/ResponseActions/ResponseActions.js +28 -7
  192. package/dist/esm/ResponseActions/ResponseActions.test.js +67 -12
  193. package/dist/esm/ResponseActions/ResponseActionsGroups.d.ts +13 -0
  194. package/dist/esm/ResponseActions/ResponseActionsGroups.js +18 -0
  195. package/dist/esm/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
  196. package/dist/esm/ResponseActions/ResponseActionsGroups.test.js +20 -0
  197. package/dist/esm/ResponseActions/index.d.ts +1 -0
  198. package/dist/esm/ResponseActions/index.js +1 -0
  199. package/dist/esm/ToolCall/ToolCall.d.ts +11 -0
  200. package/dist/esm/ToolCall/ToolCall.js +21 -3
  201. package/dist/esm/ToolCall/ToolCall.test.js +57 -0
  202. package/dist/esm/ToolResponse/ToolResponse.d.ts +17 -0
  203. package/dist/esm/ToolResponse/ToolResponse.js +46 -3
  204. package/dist/esm/ToolResponse/ToolResponse.test.js +100 -0
  205. package/dist/esm/index.d.ts +4 -0
  206. package/dist/esm/index.js +4 -0
  207. package/dist/tsconfig.tsbuildinfo +1 -1
  208. package/package.json +13 -3
  209. package/patternfly-docs/content/extensions/chatbot/chatbot.md +57 -0
  210. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +12 -12
  211. package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +1 -1
  212. package/patternfly-docs/content/extensions/chatbot/examples/Customizing Messages/Customizing Messages.md +1 -1
  213. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +1 -0
  214. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomStructure.tsx +102 -0
  215. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithDeepThinking.tsx +25 -11
  216. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +14 -1
  217. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownDeepThinking.tsx +26 -0
  218. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownToolCall.tsx +29 -0
  219. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownToolResponse.tsx +200 -0
  220. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMultipleActionGroups.tsx +61 -0
  221. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithPersistedActions.tsx +22 -0
  222. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +11 -0
  223. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolCall.tsx +14 -1
  224. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolResponse.tsx +222 -105
  225. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +123 -14
  226. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +1 -0
  227. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSearchActions.tsx +198 -0
  228. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarCustomActions.tsx +190 -0
  229. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarIndicatorThinking.tsx +15 -0
  230. package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactOnboarding.tsx +141 -0
  231. package/patternfly-docs/content/extensions/chatbot/examples/UI/Onboarding.tsx +151 -0
  232. package/patternfly-docs/content/extensions/chatbot/examples/UI/RH-Hat-Image.svg +9 -0
  233. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +81 -30
  234. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +18 -18
  235. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +33 -19
  236. package/patternfly-docs/patternfly-docs.config.js +1 -1
  237. package/patternfly-docs/patternfly-docs.source.js +1 -1
  238. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +43 -0
  239. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +95 -0
  240. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +51 -15
  241. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +56 -14
  242. package/src/ChatbotModal/ChatbotModal.scss +3 -0
  243. package/src/CodeModal/CodeModal.tsx +71 -26
  244. package/src/DeepThinking/DeepThinking.scss +1 -1
  245. package/src/DeepThinking/DeepThinking.test.tsx +109 -0
  246. package/src/DeepThinking/DeepThinking.tsx +54 -5
  247. package/src/MarkdownContent/MarkdownContent.test.tsx +207 -0
  248. package/src/MarkdownContent/MarkdownContent.tsx +269 -0
  249. package/src/MarkdownContent/index.ts +2 -0
  250. package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +13 -0
  251. package/src/Message/CodeBlockMessage/CodeBlockMessage.test.tsx +171 -0
  252. package/src/Message/CodeBlockMessage/CodeBlockMessage.tsx +17 -4
  253. package/src/Message/ErrorMessage/ErrorMessage.test.tsx +38 -0
  254. package/src/Message/ErrorMessage/ErrorMessage.tsx +17 -2
  255. package/src/Message/LinkMessage/LinkMessage.scss +5 -0
  256. package/src/Message/LinkMessage/LinkMessage.tsx +24 -2
  257. package/src/Message/ListMessage/ListMessage.scss +8 -0
  258. package/src/Message/ListMessage/OrderedListMessage.tsx +16 -2
  259. package/src/Message/ListMessage/UnorderedListMessage.tsx +12 -2
  260. package/src/Message/Message.scss +11 -7
  261. package/src/Message/Message.test.tsx +202 -2
  262. package/src/Message/Message.tsx +129 -241
  263. package/src/Message/MessageAndActions/MessageAndActions.test.tsx +23 -0
  264. package/src/Message/MessageAndActions/MessageAndActions.tsx +22 -0
  265. package/src/Message/MessageAndActions/index.ts +1 -0
  266. package/src/Message/MessageAttachments/MessageAttachmentItem.test.tsx +23 -0
  267. package/src/Message/MessageAttachments/MessageAttachmentItem.tsx +25 -0
  268. package/src/Message/MessageAttachments/MessageAttachmentsContainer.test.tsx +23 -0
  269. package/src/Message/MessageAttachments/MessageAttachmentsContainer.tsx +25 -0
  270. package/src/Message/MessageAttachments/index.ts +2 -0
  271. package/src/Message/MessageInput.tsx +1 -1
  272. package/src/Message/MessageLoading.test.tsx +23 -0
  273. package/src/Message/MessageLoading.tsx +17 -2
  274. package/src/Message/QuickResponse/QuickResponse.scss +3 -1
  275. package/src/Message/QuickResponse/QuickResponse.test.tsx +131 -0
  276. package/src/Message/QuickResponse/QuickResponse.tsx +3 -2
  277. package/src/Message/QuickResponse/index.ts +1 -0
  278. package/src/Message/QuickStarts/QuickStartTile.tsx +1 -1
  279. package/src/Message/QuickStarts/index.ts +2 -0
  280. package/src/Message/TableMessage/TableMessage.scss +13 -1
  281. package/src/Message/TableMessage/TableMessage.tsx +18 -2
  282. package/src/Message/TextMessage/TextMessage.scss +12 -0
  283. package/src/Message/TextMessage/TextMessage.tsx +29 -2
  284. package/src/Message/UserFeedback/UserFeedback.scss +28 -1
  285. package/src/Message/UserFeedback/UserFeedback.tsx +23 -13
  286. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +1 -4
  287. package/src/Message/UserFeedback/index.ts +2 -0
  288. package/src/Message/index.ts +8 -0
  289. package/src/MessageBar/AttachButton.scss +0 -1
  290. package/src/MessageBar/MessageBar.scss +63 -7
  291. package/src/MessageBar/MessageBar.test.tsx +39 -0
  292. package/src/MessageBar/MessageBar.tsx +124 -48
  293. package/src/MessageBar/MicrophoneButton.scss +0 -1
  294. package/src/MessageBar/SendButton.scss +0 -1
  295. package/src/MessageBar/StopButton.scss +0 -1
  296. package/src/Onboarding/Onboarding.scss +101 -0
  297. package/src/Onboarding/Onboarding.test.tsx +148 -0
  298. package/src/Onboarding/Onboarding.tsx +126 -0
  299. package/src/Onboarding/index.ts +3 -0
  300. package/src/ResponseActions/ResponseActions.scss +12 -1
  301. package/src/ResponseActions/ResponseActions.test.tsx +111 -12
  302. package/src/ResponseActions/ResponseActions.tsx +44 -10
  303. package/src/ResponseActions/ResponseActionsGroups.test.tsx +23 -0
  304. package/src/ResponseActions/ResponseActionsGroups.tsx +28 -0
  305. package/src/ResponseActions/index.ts +1 -0
  306. package/src/ToolCall/ToolCall.scss +1 -1
  307. package/src/ToolCall/ToolCall.test.tsx +91 -0
  308. package/src/ToolCall/ToolCall.tsx +49 -4
  309. package/src/ToolResponse/ToolResponse.scss +13 -3
  310. package/src/ToolResponse/ToolResponse.test.tsx +119 -0
  311. package/src/ToolResponse/ToolResponse.tsx +82 -7
  312. package/src/index.ts +6 -0
  313. package/src/main.scss +2 -0
  314. package/tsconfig.json +1 -1
  315. package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +0 -44
@@ -2,8 +2,23 @@
2
2
  // Chatbot Main - Message - Processing
3
3
  // ============================================================================
4
4
 
5
- const MessageLoading = ({ loadingWord, isPrimary }) => (
6
- <div className={`pf-chatbot__message-loading ${isPrimary ? 'pf-m-primary' : ''}`}>
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,7 +1,8 @@
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 {
@@ -24,4 +25,15 @@
24
25
  .pf-v6-c-table__tr:last-of-type {
25
26
  border-block-end: 0;
26
27
  }
28
+
29
+ &.pf-m-markdown {
30
+ table,
31
+ tbody,
32
+ td,
33
+ thead,
34
+ th,
35
+ tr {
36
+ font-size: inherit;
37
+ }
38
+ }
27
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;
@@ -20,10 +21,20 @@ export interface TableNode {
20
21
  }
21
22
 
22
23
  export interface TableMessageProps {
24
+ /** Content of the table */
25
+ children?: React.ReactNode;
26
+ /** Flag indicating whether primary styles should be applied. */
23
27
  isPrimary?: boolean;
28
+ /** Flag indicating that the content should retain message styles when using Markdown. */
29
+ shouldRetainStyles?: boolean;
24
30
  }
25
31
 
26
- const TableMessage = ({ children, isPrimary, ...props }: Omit<TableProps, 'ref'> & ExtraProps & TableMessageProps) => {
32
+ const TableMessage = ({
33
+ children,
34
+ isPrimary,
35
+ shouldRetainStyles,
36
+ ...props
37
+ }: Omit<TableProps, 'ref'> & ExtraProps & TableMessageProps) => {
27
38
  const { className, ...rest } = props;
28
39
 
29
40
  // This allows us to parse the nested data we get back from the 3rd party Markdown parser
@@ -76,7 +87,12 @@ const TableMessage = ({ children, isPrimary, ...props }: Omit<TableProps, 'ref'>
76
87
  <Table
77
88
  aria-label={props['aria-label']}
78
89
  gridBreakPoint="grid"
79
- className={`pf-chatbot__message-table ${isPrimary ? 'pf-m-primary' : ''} ${className ? className : ''}`}
90
+ className={css(
91
+ 'pf-chatbot__message-table',
92
+ isPrimary && 'pf-m-primary',
93
+ shouldRetainStyles && 'pf-m-markdown',
94
+ className
95
+ )}
80
96
  {...rest}
81
97
  >
82
98
  {modifyChildren(children)}
@@ -53,6 +53,14 @@
53
53
  background-color: var(--pf-t--global--background--color--secondary--default);
54
54
  }
55
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
+ }
56
64
  }
57
65
 
58
66
  // ============================================================================
@@ -102,6 +110,10 @@ li[id*='user-content-fn-']:has(> span > span > .pf-chatbot__message-text + .pf-c
102
110
  }
103
111
  }
104
112
 
113
+ blockquote {
114
+ border-inline-start-color: var(--pf-t--global--border--color--alt);
115
+ }
116
+
105
117
  .pf-chatbot__message-text > .pf-chatbot__message-text {
106
118
  background-color: initial;
107
119
  padding: initial;
@@ -4,19 +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
9
  export interface TextMessageProps {
10
+ /** The text message content */
11
+ children?: React.ReactNode;
12
+ /** Flag indicating whether primary styling is applied. */
9
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;
10
36
  }
11
37
 
12
38
  const TextMessage = ({
13
39
  component,
14
40
  children,
15
41
  isPrimary,
42
+ shouldRetainStyles,
16
43
  ...props
17
44
  }: Omit<ContentProps, 'ref'> & ExtraProps & TextMessageProps) => (
18
- <span className={`pf-chatbot__message-text ${isPrimary ? 'pf-m-primary' : ''}`}>
19
- <Content component={component} {...props}>
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)}>
20
47
  {children}
21
48
  </Content>
22
49
  </span>
@@ -36,6 +36,11 @@
36
36
  }
37
37
 
38
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
+ }
39
44
  .pf-chatbot__feedback-card-title {
40
45
  font-family: var(--pf-t--global--font--family--heading);
41
46
  font-size: var(--pf-t--global--font--size--md);
@@ -51,10 +56,32 @@
51
56
  font-weight: initial;
52
57
  }
53
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
+
54
67
  // Compact styles
55
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
+
56
75
  .pf-chatbot__feedback-card-form.pf-m-compact {
57
- --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
+ }
58
85
  }
59
86
  }
60
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
  }
@@ -21,21 +21,43 @@
21
21
  justify-content: flex-end;
22
22
  background-color: var(--pf-t--global--background--color--primary--default);
23
23
  border-radius: calc(var(--pf-t--global--border--radius--medium) * 2);
24
- transition: box-shadow var(--pf-t--global--motion--timing-function--accelerate)
24
+ transition: border-color var(--pf-t--global--motion--timing-function--accelerate)
25
25
  var(--pf-t--global--motion--duration--sm);
26
+ position: relative;
27
+ border: var(--pf-t--global--border--width--control--default) solid transparent;
26
28
 
27
29
  overflow: hidden;
28
30
 
31
+ &::after {
32
+ content: '';
33
+ position: absolute;
34
+ inset: 0;
35
+ border-radius: inherit;
36
+ border: var(--pf-t--global--border--width--control--default) solid transparent;
37
+ pointer-events: none;
38
+ transition:
39
+ border-color var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--sm),
40
+ border-width var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--sm);
41
+ }
42
+
29
43
  &.pf-m-primary {
30
- box-shadow: inset 0 0 0 1px var(--pf-t--global--border--color--default);
44
+ &::after {
45
+ border-color: var(--pf-t--global--border--color--default);
46
+ }
31
47
  }
32
48
 
33
49
  &:hover {
34
- box-shadow: inset 0 0 0 1px var(--pf-t--global--border--color--default);
50
+ &::after {
51
+ border-color: var(--pf-t--global--border--color--default);
52
+ border-width: var(--pf-t--global--border--width--control--hover);
53
+ }
35
54
  }
36
55
 
37
56
  &:focus-within {
38
- box-shadow: inset 0 0 0 2px var(--pf-t--global--color--brand--default);
57
+ &::after {
58
+ border-color: var(--pf-t--global--color--brand--default);
59
+ border-width: var(--pf-t--global--border--width--control--clicked);
60
+ }
39
61
  }
40
62
 
41
63
  &-actions {
@@ -44,6 +66,19 @@
44
66
  padding-block-start: var(--pf-t--global--spacer--xs);
45
67
  padding-block-end: var(--pf-t--global--spacer--xs);
46
68
  gap: var(--pf-t--global--spacer--gap--action-to-action--plain);
69
+
70
+ &.pf-m-grouped {
71
+ flex-basis: 100%;
72
+ justify-content: space-between;
73
+ }
74
+ }
75
+
76
+ &-actions-group {
77
+ display: flex;
78
+ padding-block-start: var(--pf-t--global--spacer--xs);
79
+ padding-block-end: var(--pf-t--global--spacer--xs);
80
+ gap: var(--pf-t--global--spacer--gap--action-to-action--plain);
81
+ align-items: center;
47
82
  }
48
83
 
49
84
  &-input {
@@ -125,9 +160,30 @@
125
160
  .pf-chatbot__message-textarea {
126
161
  font-size: var(--pf-t--global--font--size--sm) !important;
127
162
  }
163
+ }
128
164
 
129
- .pf-chatbot__message-bar-actions {
130
- padding-block-start: var(--pf-t--global--spacer--md);
131
- padding-block-end: var(--pf-t--global--spacer--md);
165
+ .pf-m-compact {
166
+ .pf-chatbot__message-bar-actions,
167
+ .pf-chatbot__message-bar-actions-group {
168
+ padding-block-start: var(--pf-t--global--spacer--sm);
169
+ padding-block-end: var(--pf-t--global--spacer--sm);
170
+ }
171
+ }
172
+
173
+ // ============================================================================
174
+ // Multiline textarea styles (2+ lines)
175
+ // ============================================================================
176
+ .pf-chatbot__message-bar.pf-m-multiline {
177
+ border-radius: calc(var(--pf-t--global--border--radius--small) * 2);
178
+ }
179
+
180
+ // ============================================================================
181
+ // High contrast styles
182
+ // ============================================================================
183
+ :root:where(.pf-v6-theme-high-contrast) {
184
+ .pf-chatbot__message-bar {
185
+ &::after {
186
+ border-color: var(--pf-t--global--border--color--default);
187
+ }
132
188
  }
133
189
  }
@@ -476,4 +476,43 @@ describe('Message bar', () => {
476
476
  const { container } = render(<MessageBar isPrimary onSendMessage={jest.fn} />);
477
477
  expect(container.querySelector('.pf-m-primary')).toBeTruthy();
478
478
  });
479
+
480
+ it('Renders with class pf-v6-m-ai-indicator when hasAiIndicator is true', () => {
481
+ render(<MessageBar onSendMessage={jest.fn} hasAiIndicator />);
482
+
483
+ expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar')).toHaveClass('pf-v6-m-ai-indicator');
484
+ });
485
+
486
+ it('Renders with class pf-v6-m-thinking when isThinking is true', () => {
487
+ render(<MessageBar onSendMessage={jest.fn} isThinking />);
488
+
489
+ expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar')).toHaveClass('pf-v6-m-thinking');
490
+ });
491
+
492
+ it('Renders with flex-basis of auto by default', () => {
493
+ render(<MessageBar onSendMessage={jest.fn} />);
494
+
495
+ expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar-input')).toHaveAttribute(
496
+ 'style',
497
+ 'flex-basis: auto;'
498
+ );
499
+ });
500
+
501
+ it('Renders with flex-basis of 100% when forceMultilineLayout is true', () => {
502
+ render(<MessageBar forceMultilineLayout onSendMessage={jest.fn} />);
503
+
504
+ expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar-input')).toHaveAttribute(
505
+ 'style',
506
+ 'flex-basis: 100%;'
507
+ );
508
+ });
509
+
510
+ it('Renders with flex-basis of 100% when additionalActions is truthy', () => {
511
+ render(<MessageBar additionalActions="actions" onSendMessage={jest.fn} />);
512
+
513
+ expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar-input')).toHaveAttribute(
514
+ 'style',
515
+ 'flex-basis: 100%;'
516
+ );
517
+ });
479
518
  });