@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
@@ -10,6 +10,7 @@ import {
10
10
  TextAreaProps,
11
11
  TooltipProps
12
12
  } from '@patternfly/react-core';
13
+ import { css } from '@patternfly/react-styles';
13
14
 
14
15
  // Import Chatbot components
15
16
  import SendButton from './SendButton';
@@ -57,6 +58,8 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
57
58
  placeholder?: string;
58
59
  /** Flag to disable/enable the Attach button */
59
60
  hasAttachButton?: boolean;
61
+ /** Whether the attach button is rendered before or after the message input. */
62
+ attachButtonPosition?: 'start' | 'end';
60
63
  /** Flag to enable the Microphone button */
61
64
  hasMicrophoneButton?: boolean;
62
65
  /** Placeholder text when listening */
@@ -115,6 +118,14 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
115
118
  innerRef?: React.Ref<HTMLTextAreaElement>;
116
119
  /** Sets background color to primary */
117
120
  isPrimary?: boolean;
121
+ /** Additional actions to render for the message bar. This will force a multiline layout, and the actions will render at the start of the container. */
122
+ additionalActions?: React.ReactNode;
123
+ /** Flag indicating whether a multiline layout for the message input and actions should be forced. This can be used to always render actions below the message input. */
124
+ forceMultilineLayout?: boolean;
125
+ /** @beta Flag indicating whether the message bar has an AI indicator border. */
126
+ hasAiIndicator?: boolean;
127
+ /** @beta Flag indicating whether the chatbot is thinking in response to a query, adding an animation to the message bar. */
128
+ isThinking?: boolean;
118
129
  }
119
130
 
120
131
  export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
@@ -123,6 +134,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
123
134
  alwayShowSendButton,
124
135
  placeholder = 'Send a message...',
125
136
  hasAttachButton = true,
137
+ attachButtonPosition = 'end',
126
138
  hasMicrophoneButton,
127
139
  listeningText = 'Listening',
128
140
  handleAttach,
@@ -146,6 +158,10 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
146
158
  dropzoneProps,
147
159
  innerRef,
148
160
  isPrimary,
161
+ additionalActions,
162
+ forceMultilineLayout = false,
163
+ hasAiIndicator,
164
+ isThinking,
149
165
  ...props
150
166
  }: MessageBarProps) => {
151
167
  // Text Input
@@ -154,12 +170,21 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
154
170
  const [isListeningMessage, setIsListeningMessage] = useState<boolean>(false);
155
171
  const [hasSentMessage, setHasSentMessage] = useState(false);
156
172
  const [isComposing, setIsComposing] = useState(false);
173
+
174
+ const shouldForceMultiline = forceMultilineLayout || additionalActions;
175
+ const [isMultiline, setIsMultiline] = useState(shouldForceMultiline);
157
176
  const inputRef = useRef<HTMLTextAreaElement>(null);
158
177
  const textareaRef = (innerRef as React.RefObject<HTMLTextAreaElement>) ?? inputRef;
159
178
  const attachButtonRef = useRef<HTMLButtonElement>(null);
160
179
 
161
180
  const topMargin = '1rem';
162
181
 
182
+ useEffect(() => {
183
+ if (value !== undefined && value !== message) {
184
+ setMessage(value);
185
+ }
186
+ }, [value, message]);
187
+
163
188
  const setInitialLineHeight = (field: HTMLTextAreaElement) => {
164
189
  field.style.setProperty('line-height', '1rem');
165
190
  const parent = field.parentElement;
@@ -170,7 +195,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
170
195
 
171
196
  const grandparent = parent.parentElement;
172
197
  if (grandparent) {
173
- grandparent.style.setProperty('flex-basis', 'auto');
198
+ grandparent.style.setProperty('flex-basis', shouldForceMultiline ? '100%' : 'auto');
174
199
  }
175
200
  }
176
201
  };
@@ -202,11 +227,24 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
202
227
  return lines > 2;
203
228
  };
204
229
 
230
+ const checkIfMultiline = useCallback(
231
+ (field: HTMLTextAreaElement) => {
232
+ const parent = field.parentElement;
233
+ const grandparent = parent?.parentElement;
234
+ if (grandparent) {
235
+ const containerHeight = grandparent.offsetHeight;
236
+ const threshold = isCompact ? 56 : 70;
237
+ setIsMultiline(containerHeight > threshold);
238
+ }
239
+ },
240
+ [isCompact]
241
+ );
242
+
205
243
  const setAutoWidth = useCallback((field: HTMLTextAreaElement) => {
206
244
  const parent = field.parentElement;
207
245
  if (parent) {
208
246
  const grandparent = parent.parentElement;
209
- if (textIsLongerThan2Lines(field) && grandparent) {
247
+ if ((textIsLongerThan2Lines(field) || shouldForceMultiline) && grandparent) {
210
248
  grandparent.style.setProperty('flex-basis', `100%`);
211
249
  }
212
250
  }
@@ -256,12 +294,14 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
256
294
  if (field) {
257
295
  if (field.value === '') {
258
296
  setInitialLineHeight(field);
297
+ !shouldForceMultiline && setIsMultiline(false);
259
298
  } else {
260
299
  setAutoHeight(field);
261
300
  setAutoWidth(field);
301
+ !shouldForceMultiline && checkIfMultiline(field);
262
302
  }
263
303
  }
264
- }, [displayMode, message, setAutoWidth]);
304
+ }, [displayMode, message, setAutoWidth, shouldForceMultiline, checkIfMultiline]);
265
305
 
266
306
  useEffect(() => {
267
307
  const field = textareaRef.current;
@@ -277,13 +317,15 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
277
317
  if (textareaRef.current) {
278
318
  if (event.target.value === '') {
279
319
  setInitialLineHeight(textareaRef.current);
320
+ !shouldForceMultiline && setIsMultiline(false);
280
321
  } else {
281
322
  setAutoHeight(textareaRef.current);
323
+ !shouldForceMultiline && checkIfMultiline(textareaRef.current);
282
324
  }
283
325
  }
284
326
  setMessage(event.target.value);
285
327
  },
286
- [onChange]
328
+ [onChange, checkIfMultiline]
287
329
  );
288
330
 
289
331
  // Handle sending message
@@ -340,6 +382,55 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
340
382
  onChange && onChange({} as ChangeEvent<HTMLTextAreaElement>, message);
341
383
  };
342
384
 
385
+ const renderAttachButton = () => {
386
+ if (!attachMenuProps && hasAttachButton) {
387
+ return (
388
+ <AttachButton
389
+ onAttachAccepted={handleAttach}
390
+ isDisabled={isListeningMessage}
391
+ tooltipContent={buttonProps?.attach?.tooltipContent}
392
+ inputTestId={buttonProps?.attach?.inputTestId}
393
+ isCompact={isCompact}
394
+ tooltipProps={buttonProps?.attach?.tooltipProps}
395
+ allowedFileTypes={allowedFileTypes}
396
+ minSize={minSize}
397
+ maxSize={maxSize}
398
+ maxFiles={maxFiles}
399
+ isAttachmentDisabled={isAttachmentDisabled}
400
+ onAttach={onAttach}
401
+ onAttachRejected={onAttachRejected}
402
+ validator={validator}
403
+ dropzoneProps={dropzoneProps}
404
+ {...buttonProps?.attach}
405
+ {...buttonProps?.attach?.props}
406
+ />
407
+ );
408
+ }
409
+ if (attachMenuProps) {
410
+ return (
411
+ <AttachButton
412
+ ref={attachButtonRef}
413
+ onClick={handleAttachMenuToggle}
414
+ isDisabled={isListeningMessage}
415
+ tooltipContent={buttonProps?.attach?.tooltipContent}
416
+ isCompact={isCompact}
417
+ tooltipProps={buttonProps?.attach?.tooltipProps}
418
+ allowedFileTypes={allowedFileTypes}
419
+ minSize={minSize}
420
+ maxSize={maxSize}
421
+ maxFiles={maxFiles}
422
+ isAttachmentDisabled={isAttachmentDisabled}
423
+ onAttach={onAttach}
424
+ onAttachRejected={onAttachRejected}
425
+ validator={validator}
426
+ dropzoneProps={dropzoneProps}
427
+ {...buttonProps?.attach}
428
+ />
429
+ );
430
+ }
431
+ };
432
+
433
+ const isAttachButtonAtStart = attachButtonPosition === 'start';
343
434
  const renderButtons = () => {
344
435
  if (hasStopButton && handleStopButton) {
345
436
  return (
@@ -354,47 +445,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
354
445
  }
355
446
  return (
356
447
  <>
357
- {attachMenuProps && (
358
- <AttachButton
359
- ref={attachButtonRef}
360
- onClick={handleAttachMenuToggle}
361
- isDisabled={isListeningMessage}
362
- tooltipContent={buttonProps?.attach?.tooltipContent}
363
- isCompact={isCompact}
364
- tooltipProps={buttonProps?.attach?.tooltipProps}
365
- allowedFileTypes={allowedFileTypes}
366
- minSize={minSize}
367
- maxSize={maxSize}
368
- maxFiles={maxFiles}
369
- isAttachmentDisabled={isAttachmentDisabled}
370
- onAttach={onAttach}
371
- onAttachRejected={onAttachRejected}
372
- validator={validator}
373
- dropzoneProps={dropzoneProps}
374
- {...buttonProps?.attach}
375
- />
376
- )}
377
- {!attachMenuProps && hasAttachButton && (
378
- <AttachButton
379
- onAttachAccepted={handleAttach}
380
- isDisabled={isListeningMessage}
381
- tooltipContent={buttonProps?.attach?.tooltipContent}
382
- inputTestId={buttonProps?.attach?.inputTestId}
383
- isCompact={isCompact}
384
- tooltipProps={buttonProps?.attach?.tooltipProps}
385
- allowedFileTypes={allowedFileTypes}
386
- minSize={minSize}
387
- maxSize={maxSize}
388
- maxFiles={maxFiles}
389
- isAttachmentDisabled={isAttachmentDisabled}
390
- onAttach={onAttach}
391
- onAttachRejected={onAttachRejected}
392
- validator={validator}
393
- dropzoneProps={dropzoneProps}
394
- {...buttonProps?.attach}
395
- {...buttonProps?.attach?.props}
396
- />
397
- )}
448
+ {!isAttachButtonAtStart && renderAttachButton()}
398
449
  {hasMicrophoneButton && (
399
450
  <MicrophoneButton
400
451
  isListening={isListeningMessage}
@@ -422,8 +473,12 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
422
473
  );
423
474
  };
424
475
 
476
+ const hasGroupedActions = additionalActions || (isAttachButtonAtStart && isMultiline);
425
477
  const messageBarContents = (
426
478
  <>
479
+ {isAttachButtonAtStart && !isMultiline && (
480
+ <div className="pf-chatbot__message-bar-actions test">{renderAttachButton()}</div>
481
+ )}
427
482
  <div className={`pf-chatbot__message-bar-input ${isCompact ? 'pf-m-compact' : ''}`}>
428
483
  <TextArea
429
484
  className="pf-chatbot__message-textarea"
@@ -438,7 +493,19 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
438
493
  {...props}
439
494
  />
440
495
  </div>
441
- <div className="pf-chatbot__message-bar-actions">{renderButtons()}</div>
496
+ <div className={css('pf-chatbot__message-bar-actions', hasGroupedActions && 'pf-m-grouped')}>
497
+ {hasGroupedActions ? (
498
+ <>
499
+ <div className={css('pf-chatbot__message-bar-actions-group')}>
500
+ {isAttachButtonAtStart && renderAttachButton()}
501
+ {additionalActions}
502
+ </div>
503
+ <div className={css('pf-chatbot__message-bar-actions-group')}>{renderButtons()}</div>
504
+ </>
505
+ ) : (
506
+ renderButtons()
507
+ )}
508
+ </div>
442
509
  </>
443
510
  );
444
511
 
@@ -446,7 +513,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
446
513
  return (
447
514
  <AttachMenu
448
515
  toggle={(toggleRef) => (
449
- <div ref={toggleRef} className={`pf-chatbot__message-bar ${className ?? ''}`}>
516
+ <div ref={toggleRef} className={css('pf-chatbot__message-bar', isMultiline && 'pf-m-multiline', className)}>
450
517
  {messageBarContents}
451
518
  </div>
452
519
  )}
@@ -468,7 +535,16 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
468
535
  }
469
536
 
470
537
  return (
471
- <div className={`pf-chatbot__message-bar ${isPrimary ? 'pf-m-primary' : ''} ${className ?? ''}`}>
538
+ <div
539
+ className={css(
540
+ 'pf-chatbot__message-bar',
541
+ isPrimary && 'pf-m-primary',
542
+ hasAiIndicator && 'pf-v6-m-ai-indicator',
543
+ isThinking && 'pf-v6-m-thinking',
544
+ isMultiline && 'pf-m-multiline',
545
+ className
546
+ )}
547
+ >
472
548
  {messageBarContents}
473
549
  </div>
474
550
  );
@@ -53,6 +53,5 @@
53
53
  .pf-v6-c-button.pf-chatbot__button--microphone.pf-m-compact {
54
54
  width: 1.5rem;
55
55
  height: 1.5rem;
56
- padding: var(--pf-t--global--spacer--sm);
57
56
  align-items: center;
58
57
  }
@@ -58,6 +58,5 @@
58
58
  .pf-v6-c-button.pf-chatbot__button--send.pf-m-compact {
59
59
  width: 1.5rem;
60
60
  height: 1.5rem;
61
- padding: var(--pf-t--global--spacer--sm);
62
61
  align-items: center;
63
62
  }
@@ -41,6 +41,5 @@
41
41
  .pf-v6-c-button.pf-chatbot__button--stop.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
  }
@@ -0,0 +1,101 @@
1
+ .pf-chatbot__onboarding-modal {
2
+ overflow-x: hidden;
3
+
4
+ .pf-chatbot__onboarding--title {
5
+ margin-block-end: var(--pf-t--global--spacer--md);
6
+ }
7
+
8
+ .pf-chatbot__onboarding--section {
9
+ display: flex;
10
+ flex-direction: column;
11
+ width: 100%;
12
+ height: 100%;
13
+ }
14
+
15
+ .pf-chatbot__onboarding--modal-body {
16
+ display: flex;
17
+ flex-direction: column;
18
+ }
19
+
20
+ .pf-chatbot__onboarding--modal-text {
21
+ display: flex;
22
+ flex-direction: column;
23
+ justify-content: flex-end;
24
+ }
25
+
26
+ .pf-v6-c-content {
27
+ font-size: var(--pf-t--global--font--size--body--lg);
28
+ }
29
+
30
+ .pf-chatbot__onboarding--header {
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ flex-direction: column;
35
+ max-height: 65%;
36
+
37
+ img {
38
+ max-width: unset;
39
+ height: 100%;
40
+ }
41
+ }
42
+
43
+ .pf-chatbot__onboarding--title {
44
+ font-size: var(--pf-t--global--font--size--heading--h1);
45
+ font-family: var(--pf-t--global--font--family--heading);
46
+ font-weight: var(--pf-t--global--font--weight--heading--bold);
47
+ }
48
+
49
+ .pf-chatbot__onboarding--footer {
50
+ margin-block-start: var(--pf-t--global--spacer--md);
51
+ }
52
+
53
+ // for handling zoom conditions; zoom to 125% or higher to see this
54
+ @media screen and (max-height: 620px) {
55
+ .pf-v6-c-modal-box__body {
56
+ --pf-v6-c-modal-box__body--MinHeight: auto;
57
+ overflow: visible;
58
+ }
59
+ }
60
+ }
61
+
62
+ .pf-chatbot__chatbot-modal.pf-chatbot__chatbot-modal--docked.pf-chatbot__onboarding-modal.pf-chatbot__onboarding-modal--docked,
63
+ .pf-chatbot__chatbot-modal.pf-chatbot__chatbot-modal--fullscreen.pf-chatbot__onboarding-modal.pf-chatbot__onboarding-modal--fullscreen,
64
+ .pf-chatbot__chatbot-modal.pf-chatbot__chatbot-modal--embedded.pf-chatbot__onboarding-modal.pf-chatbot__onboarding-modal--embedded {
65
+ .pf-chatbot__onboarding--header {
66
+ img {
67
+ max-width: 100%;
68
+ height: auto;
69
+ }
70
+ }
71
+ }
72
+
73
+ .pf-chatbot__chatbot-modal.pf-chatbot__chatbot-modal--fullscreen.pf-chatbot__onboarding-modal.pf-chatbot__onboarding-modal--fullscreen,
74
+ .pf-chatbot__chatbot-modal.pf-chatbot__chatbot-modal--embedded.pf-chatbot__onboarding-modal.pf-chatbot__onboarding-modal--embedded {
75
+ // override parent modal style
76
+ height: inherit !important;
77
+
78
+ .pf-chatbot__onboarding--title {
79
+ font-size: var(--pf-t--global--font--size--heading--2xl);
80
+ }
81
+ }
82
+
83
+ .pf-chatbot__onboarding-modal.pf-m-compact {
84
+ .pf-chatbot__onboarding--header {
85
+ gap: var(--pf-t--global--spacer--md);
86
+ align-items: flex-start;
87
+ margin-block-start: var(--pf-t--global--spacer--lg);
88
+ }
89
+
90
+ .pf-chatbot__onboarding--modal-header {
91
+ --pf-v6-c-modal-box__header--PaddingBlockStart: var(--pf-t--global--spacer--md);
92
+ --pf-v6-c-modal-box__header--PaddingBlockEnd: var(--pf-t--global--spacer--md);
93
+ --pf-v6-c-modal-box__header--PaddingInlineStart: var(--pf-t--global--spacer--md);
94
+ --pf-v6-c-modal-box__header--PaddingInlineEnd: var(--pf-t--global--spacer--md);
95
+ }
96
+
97
+ .pf-chatbot__onboarding--modal-body {
98
+ --pf-v6-c-modal-box__body--PaddingInlineStart: var(--pf-t--global--spacer--md);
99
+ --pf-v6-c-modal-box__body--PaddingInlineEnd: var(--pf-t--global--spacer--md);
100
+ }
101
+ }
@@ -0,0 +1,148 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import '@testing-library/jest-dom';
3
+ import userEvent from '@testing-library/user-event';
4
+ import Onboarding from './Onboarding';
5
+
6
+ const handleModalToggle = jest.fn();
7
+ const onPrimaryAction = jest.fn();
8
+ const onSecondaryAction = jest.fn();
9
+
10
+ const body =
11
+ 'Experience personalized assistance and seamless problem-solving, simplifying your journey with Red Hat every step of the way.';
12
+
13
+ describe('Onboarding', () => {
14
+ afterEach(() => {
15
+ jest.clearAllMocks();
16
+ });
17
+ it('should render modal correctly', () => {
18
+ render(
19
+ <Onboarding
20
+ isModalOpen
21
+ onSecondaryAction={onSecondaryAction}
22
+ handleModalToggle={handleModalToggle}
23
+ ouiaId="Terms"
24
+ >
25
+ {body}
26
+ </Onboarding>
27
+ );
28
+ expect(screen.getByRole('heading', { name: /Onboarding/i })).toBeTruthy();
29
+ expect(screen.getByRole('button', { name: /Continue/i })).toBeTruthy();
30
+ expect(screen.getByRole('button', { name: /Skip/i })).toBeTruthy();
31
+ expect(screen.getByText(body)).toBeTruthy();
32
+ expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal');
33
+ expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal--default');
34
+ });
35
+ it('should handle image and altText props', () => {
36
+ render(
37
+ <Onboarding
38
+ isModalOpen
39
+ onSecondaryAction={onSecondaryAction}
40
+ handleModalToggle={handleModalToggle}
41
+ headerImage="./image.png"
42
+ headerImageAltText="Test image"
43
+ >
44
+ {body}
45
+ </Onboarding>
46
+ );
47
+ expect(screen.getByRole('img')).toBeTruthy();
48
+ expect(screen.getByRole('img')).toHaveAttribute('alt', 'Test image');
49
+ });
50
+ it('should handle className prop', () => {
51
+ render(
52
+ <Onboarding
53
+ isModalOpen
54
+ onSecondaryAction={onSecondaryAction}
55
+ handleModalToggle={handleModalToggle}
56
+ className="test"
57
+ >
58
+ {body}
59
+ </Onboarding>
60
+ );
61
+ expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal');
62
+ expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal--default');
63
+ expect(screen.getByRole('dialog')).toHaveClass('test');
64
+ });
65
+ it('should handle title prop', () => {
66
+ render(
67
+ <Onboarding
68
+ isModalOpen
69
+ onSecondaryAction={onSecondaryAction}
70
+ handleModalToggle={handleModalToggle}
71
+ title="Updated title"
72
+ >
73
+ {body}
74
+ </Onboarding>
75
+ );
76
+ expect(screen.getByRole('heading', { name: /Updated title/i })).toBeTruthy();
77
+ expect(screen.queryByRole('heading', { name: /Onboarding/i })).toBeFalsy();
78
+ });
79
+ it('should handle primary button prop', () => {
80
+ render(
81
+ <Onboarding
82
+ isModalOpen
83
+ onSecondaryAction={onSecondaryAction}
84
+ handleModalToggle={handleModalToggle}
85
+ primaryActionBtn="First"
86
+ >
87
+ {body}
88
+ </Onboarding>
89
+ );
90
+ expect(screen.getByRole('button', { name: /First/i })).toBeTruthy();
91
+ expect(screen.queryByRole('button', { name: /Continue/i })).toBeFalsy();
92
+ });
93
+ it('should handle secondary button prop', () => {
94
+ render(
95
+ <Onboarding
96
+ isModalOpen
97
+ onSecondaryAction={onSecondaryAction}
98
+ handleModalToggle={handleModalToggle}
99
+ secondaryActionBtn="Second"
100
+ >
101
+ {body}
102
+ </Onboarding>
103
+ );
104
+ expect(screen.getByRole('button', { name: /Second/i })).toBeTruthy();
105
+ expect(screen.queryByRole('button', { name: /Skip/i })).toBeFalsy();
106
+ });
107
+ it('should handle primary button click', async () => {
108
+ render(
109
+ <Onboarding
110
+ isModalOpen
111
+ onPrimaryAction={onPrimaryAction}
112
+ onSecondaryAction={onSecondaryAction}
113
+ handleModalToggle={handleModalToggle}
114
+ >
115
+ {body}
116
+ </Onboarding>
117
+ );
118
+ await userEvent.click(screen.getByRole('button', { name: /Continue/i }));
119
+ expect(onPrimaryAction).toHaveBeenCalledTimes(1);
120
+ expect(handleModalToggle).toHaveBeenCalledTimes(1);
121
+ });
122
+ it('should handle secondary button click', async () => {
123
+ render(
124
+ <Onboarding isModalOpen onSecondaryAction={onSecondaryAction} handleModalToggle={handleModalToggle}>
125
+ {body}
126
+ </Onboarding>
127
+ );
128
+ await userEvent.click(screen.getByRole('button', { name: /Skip/i }));
129
+ expect(onSecondaryAction).toHaveBeenCalledTimes(1);
130
+ expect(handleModalToggle).not.toHaveBeenCalled();
131
+ });
132
+ it('should handle isCompact prop', () => {
133
+ render(
134
+ <Onboarding
135
+ isModalOpen
136
+ onSecondaryAction={onSecondaryAction}
137
+ handleModalToggle={handleModalToggle}
138
+ isCompact={true}
139
+ headerImage="./image.png"
140
+ headerImageAltText="Test image"
141
+ >
142
+ {body}
143
+ </Onboarding>
144
+ );
145
+ expect(screen.getByRole('dialog')).toHaveClass('pf-m-compact');
146
+ expect(screen.queryByRole('img')).toBeFalsy();
147
+ });
148
+ });