@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
@@ -1,4 +1,5 @@
1
1
  import { render, screen } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
2
3
  import '@testing-library/jest-dom';
3
4
  import DeepThinking from './DeepThinking';
4
5
 
@@ -58,4 +59,112 @@ describe('DeepThinking', () => {
58
59
  const subheadingContainer = container.querySelector('.pf-chatbot__tool-response-subheading');
59
60
  expect(subheadingContainer).toBeFalsy();
60
61
  });
62
+
63
+ it('should pass through cardBodyProps', () => {
64
+ render(
65
+ <DeepThinking {...defaultProps} body="Thinking content" cardBodyProps={{ className: 'custom-card-body-class' }} />
66
+ );
67
+
68
+ const cardBody = screen.getByText('Thinking content').closest('.pf-v6-c-card__body');
69
+ expect(cardBody).toHaveClass('custom-card-body-class');
70
+ });
71
+
72
+ it('Renders expanded by default', () => {
73
+ render(<DeepThinking {...defaultProps} body="Thinking content" />);
74
+
75
+ expect(screen.getByRole('button', { name: defaultProps.toggleContent })).toHaveAttribute('aria-expanded', 'true');
76
+ expect(screen.getByText('Thinking content')).toBeVisible();
77
+ });
78
+
79
+ it('Renders collapsed when isDefaultExpanded is false', () => {
80
+ render(<DeepThinking isDefaultExpanded={false} {...defaultProps} body="Thinking content" />);
81
+
82
+ expect(screen.getByRole('button', { name: defaultProps.toggleContent })).toHaveAttribute('aria-expanded', 'false');
83
+ expect(screen.getByText('Thinking content')).not.toBeVisible();
84
+ });
85
+
86
+ it('expandableSectionProps.isExpanded overrides isDefaultExpanded', () => {
87
+ render(
88
+ <DeepThinking
89
+ {...defaultProps}
90
+ isDefaultExpanded={false}
91
+ body="Thinking content"
92
+ expandableSectionProps={{ isExpanded: true }}
93
+ />
94
+ );
95
+
96
+ expect(screen.getByRole('button', { name: defaultProps.toggleContent })).toHaveAttribute('aria-expanded', 'true');
97
+ expect(screen.getByText('Thinking content')).toBeVisible();
98
+ });
99
+
100
+ it('expandableSectionProps.onToggle overrides internal onToggle behavior', async () => {
101
+ const user = userEvent.setup();
102
+ const customOnToggle = jest.fn();
103
+
104
+ render(
105
+ <DeepThinking
106
+ {...defaultProps}
107
+ isDefaultExpanded={false}
108
+ body="Thinking content"
109
+ expandableSectionProps={{ onToggle: customOnToggle }}
110
+ />
111
+ );
112
+
113
+ const toggleButton = screen.getByRole('button', { name: defaultProps.toggleContent });
114
+ expect(toggleButton).toHaveAttribute('aria-expanded', 'false');
115
+
116
+ await user.click(toggleButton);
117
+
118
+ expect(customOnToggle).toHaveBeenCalled();
119
+ expect(toggleButton).toHaveAttribute('aria-expanded', 'false');
120
+ expect(screen.getByText('Thinking content')).not.toBeVisible();
121
+ });
122
+
123
+ it('should render toggleContent as markdown when isToggleContentMarkdown is true', () => {
124
+ const toggleContent = '**Bold thinking**';
125
+ const { container } = render(<DeepThinking toggleContent={toggleContent} isToggleContentMarkdown />);
126
+ expect(container.querySelector('strong')).toBeTruthy();
127
+ expect(screen.getByText('Bold thinking')).toBeTruthy();
128
+ });
129
+
130
+ it('should not render toggleContent as markdown when isToggleContentMarkdown is false', () => {
131
+ const toggleContent = '**Bold thinking**';
132
+ const { container } = render(<DeepThinking toggleContent={toggleContent} />);
133
+ expect(container.querySelector('strong')).toBeFalsy();
134
+ expect(screen.getByText('**Bold thinking**')).toBeTruthy();
135
+ });
136
+
137
+ it('should render subheading as markdown when isSubheadingMarkdown is true', () => {
138
+ const subheading = '**Bold subheading**';
139
+ const { container } = render(<DeepThinking {...defaultProps} subheading={subheading} isSubheadingMarkdown />);
140
+ expect(container.querySelector('strong')).toBeTruthy();
141
+ expect(screen.getByText('Bold subheading')).toBeTruthy();
142
+ });
143
+
144
+ it('should not render subheading as markdown when isSubheadingMarkdown is false', () => {
145
+ const subheading = '**Bold subheading**';
146
+ render(<DeepThinking {...defaultProps} subheading={subheading} />);
147
+ expect(screen.getByText('**Bold subheading**')).toBeTruthy();
148
+ });
149
+
150
+ it('should render body as markdown when isBodyMarkdown is true', () => {
151
+ const body = '**Bold body**';
152
+ const { container } = render(<DeepThinking {...defaultProps} body={body} isBodyMarkdown />);
153
+ expect(container.querySelector('strong')).toBeTruthy();
154
+ expect(screen.getByText('Bold body')).toBeTruthy();
155
+ });
156
+
157
+ it('should not render body as markdown when isBodyMarkdown is false', () => {
158
+ const body = '**Bold body**';
159
+ render(<DeepThinking {...defaultProps} body={body} />);
160
+ expect(screen.getByText('**Bold body**')).toBeTruthy();
161
+ });
162
+
163
+ it('should pass markdownContentProps to MarkdownContent component', () => {
164
+ const body = '**Bold body**';
165
+ const { container } = render(
166
+ <DeepThinking {...defaultProps} body={body} isBodyMarkdown markdownContentProps={{ isPrimary: true }} />
167
+ );
168
+ expect(container.querySelector('.pf-m-primary')).toBeTruthy();
169
+ });
61
170
  });
@@ -10,10 +10,14 @@ import {
10
10
  ExpandableSectionProps
11
11
  } from '@patternfly/react-core';
12
12
  import { useState, type FunctionComponent } from 'react';
13
+ import MarkdownContent from '../MarkdownContent';
14
+ import type { MarkdownContentProps } from '../MarkdownContent';
13
15
 
14
16
  export interface DeepThinkingProps {
15
17
  /** Toggle content shown for expandable section */
16
18
  toggleContent: React.ReactNode;
19
+ /** Flag indicating whether the expandable content is expanded by default. */
20
+ isDefaultExpanded?: boolean;
17
21
  /** Additional props passed to expandable section */
18
22
  expandableSectionProps?: Omit<ExpandableSectionProps, 'ref'>;
19
23
  /** Subheading rendered inside expandable section */
@@ -24,6 +28,16 @@ export interface DeepThinkingProps {
24
28
  cardProps?: CardProps;
25
29
  /** Additional props passed to main card body */
26
30
  cardBodyProps?: CardBodyProps;
31
+ /** Whether to enable markdown rendering for toggleContent. When true and toggleContent is a string, it will be parsed as markdown. */
32
+ isToggleContentMarkdown?: boolean;
33
+ /** Whether to enable markdown rendering for subheading. When true, subheading will be parsed as markdown. */
34
+ isSubheadingMarkdown?: boolean;
35
+ /** Whether to enable markdown rendering for body. When true and body is a string, it will be parsed as markdown. */
36
+ isBodyMarkdown?: boolean;
37
+ /** Props passed to MarkdownContent component when markdown is enabled */
38
+ markdownContentProps?: Omit<MarkdownContentProps, 'content'>;
39
+ /** Whether to retain styles in the MarkdownContent component. Defaults to false. */
40
+ shouldRetainStyles?: boolean;
27
41
  }
28
42
 
29
43
  export const DeepThinking: FunctionComponent<DeepThinkingProps> = ({
@@ -32,19 +46,54 @@ export const DeepThinking: FunctionComponent<DeepThinkingProps> = ({
32
46
  expandableSectionProps,
33
47
  subheading,
34
48
  toggleContent,
35
- cardBodyProps
49
+ isDefaultExpanded = true,
50
+ cardBodyProps,
51
+ isToggleContentMarkdown,
52
+ isSubheadingMarkdown,
53
+ isBodyMarkdown,
54
+ markdownContentProps,
55
+ shouldRetainStyles = false
36
56
  }: DeepThinkingProps) => {
37
- const [isExpanded, setIsExpanded] = useState(true);
57
+ const [isExpanded, setIsExpanded] = useState(isDefaultExpanded);
38
58
 
39
59
  const onToggle = (_event: React.MouseEvent, isExpanded: boolean) => {
40
60
  setIsExpanded(isExpanded);
41
61
  };
42
62
 
63
+ const renderToggleContent = () => {
64
+ if (isToggleContentMarkdown && typeof toggleContent === 'string') {
65
+ return (
66
+ <MarkdownContent shouldRetainStyles={shouldRetainStyles} content={toggleContent} {...markdownContentProps} />
67
+ );
68
+ }
69
+ return toggleContent;
70
+ };
71
+
72
+ const renderSubheading = () => {
73
+ if (!subheading) {
74
+ return null;
75
+ }
76
+ if (isSubheadingMarkdown) {
77
+ return <MarkdownContent shouldRetainStyles={shouldRetainStyles} content={subheading} {...markdownContentProps} />;
78
+ }
79
+ return subheading;
80
+ };
81
+
82
+ const renderBody = () => {
83
+ if (!body) {
84
+ return null;
85
+ }
86
+ if (isBodyMarkdown && typeof body === 'string') {
87
+ return <MarkdownContent shouldRetainStyles={shouldRetainStyles} content={body} {...markdownContentProps} />;
88
+ }
89
+ return body;
90
+ };
91
+
43
92
  return (
44
93
  <Card isCompact className="pf-chatbot__deep-thinking" {...cardProps}>
45
94
  <CardBody {...cardBodyProps}>
46
95
  <ExpandableSection
47
- toggleContent={toggleContent}
96
+ toggleContent={renderToggleContent()}
48
97
  onToggle={onToggle}
49
98
  isExpanded={isExpanded}
50
99
  isIndented
@@ -54,10 +103,10 @@ export const DeepThinking: FunctionComponent<DeepThinkingProps> = ({
54
103
  <div className="pf-chatbot__deep-thinking-section">
55
104
  {subheading && (
56
105
  <div className="pf-chatbot__deep-thinking-subheading">
57
- <span>{subheading}</span>
106
+ <span>{renderSubheading()}</span>
58
107
  </div>
59
108
  )}
60
- {body && <div className="pf-chatbot__deep-thinking-body">{body}</div>}
109
+ {body && <div className="pf-chatbot__deep-thinking-body">{renderBody()}</div>}
61
110
  </div>
62
111
  </ExpandableSection>
63
112
  </CardBody>
@@ -1,10 +1,10 @@
1
1
  import { PropsWithChildren } from 'react';
2
- import { Button, Label } from '@patternfly/react-core';
2
+ import { Button, Label, LabelProps } from '@patternfly/react-core';
3
3
  import FileDetails from '../FileDetails';
4
4
  import { Spinner } from '@patternfly/react-core';
5
5
  import { TimesIcon } from '@patternfly/react-icons';
6
6
 
7
- export interface FileDetailsLabelProps {
7
+ export interface FileDetailsLabelProps extends Omit<LabelProps, 'onClose' | 'onClick'> {
8
8
  /** Name of file, including extension */
9
9
  fileName: string;
10
10
  /** Unique id of file */
@@ -0,0 +1,207 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import '@testing-library/jest-dom';
3
+ import MarkdownContent from './MarkdownContent';
4
+ import rehypeExternalLinks from '../__mocks__/rehype-external-links';
5
+
6
+ const BOLD_TEXT = '**Bold text**';
7
+ const ITALIC_TEXT = '*Italic text*';
8
+ const INLINE_CODE = 'Here is inline code: `const x = 5`';
9
+ const CODE_BLOCK = `\`\`\`javascript
10
+ function hello() {
11
+ console.log('Hello, world!');
12
+ }
13
+ \`\`\``;
14
+ const HEADING = '# Heading 1';
15
+ const LINK = '[PatternFly](https://www.patternfly.org/)';
16
+ const UNORDERED_LIST = `
17
+ * Item 1
18
+ * Item 2
19
+ * Item 3
20
+ `;
21
+ const ORDERED_LIST = `
22
+ 1. First item
23
+ 2. Second item
24
+ 3. Third item
25
+ `;
26
+ const TABLE = `
27
+ | Column 1 | Column 2 |
28
+ |----------|----------|
29
+ | Cell 1 | Cell 2 |
30
+ | Cell 3 | Cell 4 |
31
+ `;
32
+ const BLOCKQUOTE = '> This is a blockquote';
33
+ const IMAGE = '![Alt text](https://example.com/image.png)';
34
+
35
+ describe('MarkdownContent', () => {
36
+ beforeEach(() => {
37
+ jest.clearAllMocks();
38
+ });
39
+
40
+ it('should render bold text correctly', () => {
41
+ const { container } = render(<MarkdownContent content={BOLD_TEXT} />);
42
+ expect(container.querySelector('strong')).toBeTruthy();
43
+ expect(screen.getByText('Bold text')).toBeTruthy();
44
+ });
45
+
46
+ it('should render italic text correctly', () => {
47
+ const { container } = render(<MarkdownContent content={ITALIC_TEXT} />);
48
+ expect(container.querySelector('em')).toBeTruthy();
49
+ expect(screen.getByText('Italic text')).toBeTruthy();
50
+ });
51
+
52
+ it('should render inline code correctly', () => {
53
+ render(<MarkdownContent content={INLINE_CODE} />);
54
+ expect(screen.getByText(/const x = 5/)).toBeTruthy();
55
+ });
56
+
57
+ it('should render code blocks correctly', () => {
58
+ render(<MarkdownContent content={CODE_BLOCK} />);
59
+
60
+ expect(screen.getByText(/function hello/)).toBeVisible();
61
+ expect(screen.getByText(/console.log/)).toBeVisible();
62
+ expect(screen.getByRole('button', { name: 'Copy code' })).toBeVisible();
63
+ });
64
+
65
+ it('should render headings correctly', () => {
66
+ render(<MarkdownContent content={HEADING} />);
67
+ expect(screen.getByRole('heading', { name: /Heading 1/i })).toBeTruthy();
68
+ });
69
+
70
+ it('should render links correctly', () => {
71
+ render(<MarkdownContent content={LINK} />);
72
+ expect(screen.getByRole('link', { name: /PatternFly/i })).toBeTruthy();
73
+ });
74
+
75
+ it('should render unordered lists correctly', () => {
76
+ render(<MarkdownContent content={UNORDERED_LIST} />);
77
+ expect(screen.getByText('Item 1')).toBeTruthy();
78
+ expect(screen.getByText('Item 2')).toBeTruthy();
79
+ expect(screen.getByText('Item 3')).toBeTruthy();
80
+ expect(screen.getAllByRole('listitem')).toHaveLength(3);
81
+ });
82
+
83
+ it('should render ordered lists correctly', () => {
84
+ render(<MarkdownContent content={ORDERED_LIST} />);
85
+ expect(screen.getByText('First item')).toBeTruthy();
86
+ expect(screen.getByText('Second item')).toBeTruthy();
87
+ expect(screen.getByText('Third item')).toBeTruthy();
88
+ expect(screen.getAllByRole('listitem')).toHaveLength(3);
89
+ });
90
+
91
+ it('should render tables correctly', () => {
92
+ render(<MarkdownContent content={TABLE} tableProps={{ 'aria-label': 'Test table' }} />);
93
+ expect(screen.getByRole('grid', { name: /Test table/i })).toBeTruthy();
94
+ expect(screen.getByRole('columnheader', { name: /Column 1/i })).toBeTruthy();
95
+ expect(screen.getByRole('columnheader', { name: /Column 2/i })).toBeTruthy();
96
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toBeTruthy();
97
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toBeTruthy();
98
+ });
99
+
100
+ it('should render blockquotes correctly', () => {
101
+ render(<MarkdownContent content={BLOCKQUOTE} />);
102
+
103
+ const quote = screen.getByText(/This is a blockquote/);
104
+ expect(quote).toBeVisible();
105
+ expect(quote.closest('.pf-v6-c-content--blockquote')?.tagName).toBe('BLOCKQUOTE');
106
+ });
107
+
108
+ it('should render images when hasNoImages is false', () => {
109
+ render(<MarkdownContent content={IMAGE} hasNoImages={false} />);
110
+ expect(screen.getByRole('img', { name: /Alt text/i })).toBeTruthy();
111
+ });
112
+
113
+ it('should not render images when hasNoImages is true', () => {
114
+ render(<MarkdownContent content={IMAGE} hasNoImages />);
115
+ expect(screen.queryByRole('img', { name: /Alt text/i })).toBeFalsy();
116
+ });
117
+
118
+ it('should disable markdown rendering when isMarkdownDisabled is true', () => {
119
+ render(<MarkdownContent content={BOLD_TEXT} isMarkdownDisabled />);
120
+ expect(screen.getByText('**Bold text**')).toBeTruthy();
121
+ });
122
+
123
+ it('should render text component when isMarkdownDisabled is true and textComponent is provided', () => {
124
+ const textComponent = <div data-testid="custom-text">Custom text component</div>;
125
+ render(<MarkdownContent content={BOLD_TEXT} isMarkdownDisabled textComponent={textComponent} />);
126
+ expect(screen.getByTestId('custom-text')).toBeTruthy();
127
+ expect(screen.getByText('Custom text component')).toBeTruthy();
128
+ });
129
+
130
+ it('should apply isPrimary prop to elements', () => {
131
+ const { container } = render(<MarkdownContent content={INLINE_CODE} isPrimary />);
132
+ expect(container.querySelector('.pf-m-primary')).toBeTruthy();
133
+ });
134
+
135
+ it('should apply shouldRetainStyles prop to elements', () => {
136
+ const { container } = render(<MarkdownContent content={BOLD_TEXT} shouldRetainStyles />);
137
+ expect(container.querySelector('.pf-m-markdown')).toBeTruthy();
138
+ });
139
+
140
+ it('should pass codeBlockProps to code blocks', () => {
141
+ render(<MarkdownContent content={CODE_BLOCK} codeBlockProps={{ 'aria-label': 'Custom code block' }} />);
142
+ expect(screen.getByRole('button', { name: /Custom code block/i })).toBeTruthy();
143
+ });
144
+
145
+ it('should pass tableProps to tables', () => {
146
+ render(<MarkdownContent content={TABLE} tableProps={{ 'aria-label': 'Custom table label' }} />);
147
+ expect(screen.getByRole('grid', { name: /Custom table label/i })).toBeTruthy();
148
+ });
149
+
150
+ it('should open links in new tab when openLinkInNewTab is true', () => {
151
+ render(<MarkdownContent content={LINK} openLinkInNewTab />);
152
+ expect(rehypeExternalLinks).toHaveBeenCalledTimes(1);
153
+ });
154
+
155
+ it('should not open links in new tab when openLinkInNewTab is false', () => {
156
+ render(<MarkdownContent content={LINK} openLinkInNewTab={false} />);
157
+ expect(rehypeExternalLinks).not.toHaveBeenCalled();
158
+ });
159
+
160
+ it('should pass linkProps to links', async () => {
161
+ const onClick = jest.fn();
162
+ render(<MarkdownContent content={LINK} linkProps={{ onClick }} />);
163
+ const link = screen.getByRole('link', { name: /PatternFly/i });
164
+ link.click();
165
+ expect(onClick).toHaveBeenCalledTimes(1);
166
+ });
167
+
168
+ it('should handle reactMarkdownProps.disallowedElements', () => {
169
+ render(<MarkdownContent content={CODE_BLOCK} reactMarkdownProps={{ disallowedElements: ['code'] }} />);
170
+ // Code block should not render when disallowed
171
+ expect(screen.queryByRole('button', { name: /Copy code/i })).toBeFalsy();
172
+ });
173
+
174
+ it('should render plain text when no markdown is present', () => {
175
+ render(<MarkdownContent content="Plain text without markdown" />);
176
+ expect(screen.getByText('Plain text without markdown')).toBeTruthy();
177
+ });
178
+
179
+ it('should handle empty content', () => {
180
+ const { container } = render(<MarkdownContent content="" />);
181
+ expect(container.textContent).toBe('');
182
+ });
183
+
184
+ it('should handle undefined content', () => {
185
+ const { container } = render(<MarkdownContent />);
186
+ expect(container.textContent).toBe('');
187
+ });
188
+
189
+ it('should render multiple markdown elements together', () => {
190
+ const content = `# Heading
191
+
192
+ **Bold text** and *italic text*
193
+
194
+ \`\`\`javascript
195
+ const x = 5;
196
+ \`\`\`
197
+
198
+ [Link](https://example.com)`;
199
+
200
+ render(<MarkdownContent content={content} />);
201
+ expect(screen.getByRole('heading', { name: /Heading/i })).toBeTruthy();
202
+ expect(screen.getByText('Bold text')).toBeTruthy();
203
+ expect(screen.getByText('italic text')).toBeTruthy();
204
+ expect(screen.getByText(/const x = 5/)).toBeTruthy();
205
+ expect(screen.getByRole('link', { name: /Link/i })).toBeTruthy();
206
+ });
207
+ });