@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
@@ -0,0 +1,198 @@
1
+ import { FunctionComponent, useState } from 'react';
2
+ import { ChatbotDisplayMode } from '@patternfly/chatbot/dist/dynamic/Chatbot';
3
+ import ChatbotConversationHistoryNav, {
4
+ Conversation
5
+ } from '@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav';
6
+ import {
7
+ Button,
8
+ Checkbox,
9
+ MenuToggle,
10
+ MenuToggleElement,
11
+ Select,
12
+ SelectList,
13
+ SelectOption,
14
+ Tooltip
15
+ } from '@patternfly/react-core';
16
+ import { FilterIcon, SortAmountDownIcon } from '@patternfly/react-icons';
17
+
18
+ const initialConversations: { [key: string]: Conversation[] } = {
19
+ Today: [{ id: '1', text: 'Red Hat products and services' }],
20
+ 'This month': [
21
+ {
22
+ id: '2',
23
+ text: 'Enterprise Linux installation and setup'
24
+ },
25
+ { id: '3', text: 'Troubleshoot system crash' }
26
+ ],
27
+ March: [
28
+ { id: '4', text: 'Ansible security and updates' },
29
+ { id: '5', text: 'Red Hat certification' },
30
+ { id: '6', text: 'Lightspeed user documentation' }
31
+ ],
32
+ February: [
33
+ { id: '7', text: 'Crashing pod assistance' },
34
+ { id: '8', text: 'OpenShift AI pipelines' },
35
+ { id: '9', text: 'Updating subscription plan' },
36
+ { id: '10', text: 'Red Hat licensing options' }
37
+ ],
38
+ January: [
39
+ { id: '11', text: 'RHEL system performance' },
40
+ { id: '12', text: 'Manage user accounts' }
41
+ ]
42
+ };
43
+
44
+ export const ChatbotHeaderTitleDemo: FunctionComponent = () => {
45
+ const [isDrawerOpen, setIsDrawerOpen] = useState(true);
46
+ const [hasDrawerHeadDivider, setHasDrawerHeadDivider] = useState(false);
47
+ const [showSearchActionStart, setShowSearchActionStart] = useState(false);
48
+ const [showSearchActionEnd, setShowSearchActionEnd] = useState(false);
49
+ const [isLoading, setIsLoading] = useState(false);
50
+ const [isSortSelectOpen, setIsSortSelectOpen] = useState(false);
51
+ const [selectedSort, setSelectedSort] = useState<string>('newest');
52
+ const [conversations, setConversations] = useState<Conversation[] | { [key: string]: Conversation[] }>(
53
+ initialConversations
54
+ );
55
+ const displayMode = ChatbotDisplayMode.embedded;
56
+
57
+ const sortLabels: { [key: string]: string } = {
58
+ newest: 'Date (newest first)',
59
+ oldest: 'Date (oldest first)',
60
+ 'alphabetical-asc': 'Name (A-Z)',
61
+ 'alphabetical-desc': 'Name (Z-A)'
62
+ };
63
+
64
+ const onSortSelect = (
65
+ _event: React.MouseEvent<Element, MouseEvent> | undefined,
66
+ value: string | number | undefined
67
+ ) => {
68
+ setSelectedSort(value as string);
69
+ setIsSortSelectOpen(false);
70
+ };
71
+
72
+ const findMatchingItems = (targetValue: string) => {
73
+ const filteredConversations = Object.entries(initialConversations).reduce((acc, [key, items]) => {
74
+ const filteredItems = items.filter((item) => item.text.toLowerCase().includes(targetValue.toLowerCase()));
75
+ if (filteredItems.length > 0) {
76
+ acc[key] = filteredItems;
77
+ }
78
+ return acc;
79
+ }, {});
80
+
81
+ return filteredConversations;
82
+ };
83
+
84
+ return (
85
+ <>
86
+ <Checkbox
87
+ label="Display drawer"
88
+ isChecked={isDrawerOpen}
89
+ onChange={() => setIsDrawerOpen(!isDrawerOpen)}
90
+ id="search-actions-drawer-visible"
91
+ name="drawer-visible"
92
+ />
93
+ <Checkbox
94
+ label="Show drawer head divider"
95
+ isChecked={hasDrawerHeadDivider}
96
+ onChange={() => setHasDrawerHeadDivider(!hasDrawerHeadDivider)}
97
+ id="search-actions-drawer-head-divider"
98
+ name="drawer-head-divider"
99
+ />
100
+ <Checkbox
101
+ label="Show search action start"
102
+ isChecked={showSearchActionStart}
103
+ onChange={() => setShowSearchActionStart(!showSearchActionStart)}
104
+ id="search-actions-show-search-action-start"
105
+ name="show-search-action-start"
106
+ />
107
+ <Checkbox
108
+ label="Show search action end"
109
+ isChecked={showSearchActionEnd}
110
+ onChange={() => setShowSearchActionEnd(!showSearchActionEnd)}
111
+ id="search-actions-show-search-action-end"
112
+ name="show-search-action-end"
113
+ />
114
+ <Checkbox
115
+ label="Show loading state"
116
+ isChecked={isLoading}
117
+ onChange={() => setIsLoading(!isLoading)}
118
+ id="search-actions-drawer-is-loading"
119
+ name="drawer-is-loading"
120
+ />
121
+ <ChatbotConversationHistoryNav
122
+ displayMode={displayMode}
123
+ onDrawerToggle={() => setIsDrawerOpen(!isDrawerOpen)}
124
+ isDrawerOpen={isDrawerOpen}
125
+ setIsDrawerOpen={setIsDrawerOpen}
126
+ // eslint-disable-next-line no-console
127
+ onSelectActiveItem={(e, selectedItem) => console.log(`Selected history item with id ${selectedItem}`)}
128
+ conversations={conversations}
129
+ onNewChat={() => {
130
+ setIsDrawerOpen(!isDrawerOpen);
131
+ }}
132
+ handleTextInputChange={(value: string) => {
133
+ if (value === '') {
134
+ setConversations(initialConversations);
135
+ } else {
136
+ const newConversations: { [key: string]: Conversation[] } = findMatchingItems(value);
137
+ setConversations(newConversations);
138
+ }
139
+ }}
140
+ drawerContent={<div>Drawer content</div>}
141
+ hasDrawerHeadDivider={hasDrawerHeadDivider}
142
+ isLoading={isLoading}
143
+ searchActionStart={
144
+ showSearchActionStart ? (
145
+ <Tooltip content="Filter options" aria="none" aria-live="off">
146
+ <Button
147
+ variant="control"
148
+ aria-label="Filter options"
149
+ // eslint-disable-next-line no-console
150
+ onClick={() => console.log('Filter button clicked')}
151
+ icon={<FilterIcon />}
152
+ />
153
+ </Tooltip>
154
+ ) : undefined
155
+ }
156
+ searchActionEnd={
157
+ showSearchActionEnd ? (
158
+ <Select
159
+ id="sort-select"
160
+ isOpen={isSortSelectOpen}
161
+ selected={selectedSort}
162
+ onSelect={onSortSelect}
163
+ shouldFocusToggleOnSelect
164
+ onOpenChange={(isOpen) => setIsSortSelectOpen(isOpen)}
165
+ toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
166
+ <Tooltip aria="none" aria-live="off" content={`Sort - ${sortLabels[selectedSort]}`}>
167
+ <MenuToggle
168
+ ref={toggleRef}
169
+ onClick={() => setIsSortSelectOpen(!isSortSelectOpen)}
170
+ isExpanded={isSortSelectOpen}
171
+ variant="plain"
172
+ aria-label={`${sortLabels[selectedSort]}, Sort conversations`}
173
+ icon={
174
+ <SortAmountDownIcon
175
+ style={{
176
+ transform:
177
+ selectedSort === 'oldest' || selectedSort === 'alphabetical-asc' ? 'scaleY(-1)' : 'none'
178
+ }}
179
+ />
180
+ }
181
+ />
182
+ </Tooltip>
183
+ )}
184
+ >
185
+ <SelectList>
186
+ {Object.keys(sortLabels).map((currentLabel) => (
187
+ <SelectOption key={currentLabel} value={currentLabel}>
188
+ {sortLabels[currentLabel]}
189
+ </SelectOption>
190
+ ))}
191
+ </SelectList>
192
+ </Select>
193
+ ) : undefined
194
+ }
195
+ />
196
+ </>
197
+ );
198
+ };
@@ -0,0 +1,190 @@
1
+ import { useState, FunctionComponent, ReactNode } from 'react';
2
+ import { MessageBar } from '@patternfly/chatbot/dist/dynamic/MessageBar';
3
+ import {
4
+ Divider,
5
+ DropdownItem,
6
+ DropdownList,
7
+ Label,
8
+ MenuToggle,
9
+ Select,
10
+ SelectList,
11
+ SelectOption
12
+ } from '@patternfly/react-core';
13
+ import { PlusIcon, ClipboardIcon, CodeIcon, UploadIcon } from '@patternfly/react-icons';
14
+ import { useDropzone } from 'react-dropzone';
15
+
16
+ export const ChatbotMessageBarCustomActionsExample: FunctionComponent = () => {
17
+ const [isFirstMenuOpen, setIsFirstMenuOpen] = useState<boolean>(false);
18
+ const [isSecondMenuOpen, setIsSecondMenuOpen] = useState<boolean>(false);
19
+ const [isModelSelectOpen, setIsModelSelectOpen] = useState<boolean>(false);
20
+ const [selectedModel, setSelectedModel] = useState<string>('GPT-4');
21
+ const [showCanvasLabel, setShowCanvasLabel] = useState<boolean>(true);
22
+
23
+ const handleSend = (message: string | number) => alert(message);
24
+
25
+ const { open, getInputProps } = useDropzone({
26
+ multiple: true,
27
+ // eslint-disable-next-line no-console
28
+ onDropAccepted: () => console.log('fileUploaded')
29
+ });
30
+
31
+ const onFirstMenuToggle = () => {
32
+ setIsFirstMenuOpen(!isFirstMenuOpen);
33
+ };
34
+
35
+ const onSecondMenuToggle = () => {
36
+ setIsSecondMenuOpen(!isSecondMenuOpen);
37
+ };
38
+
39
+ const onModelSelect = (
40
+ _event: React.MouseEvent<Element, MouseEvent> | undefined,
41
+ value: string | number | undefined
42
+ ) => {
43
+ setSelectedModel(value as string);
44
+ setIsModelSelectOpen(false);
45
+ };
46
+
47
+ const firstMenuItems: ReactNode = (
48
+ <DropdownList>
49
+ <DropdownItem value="Logs" id="logs" icon={<ClipboardIcon />}>
50
+ Logs
51
+ </DropdownItem>
52
+ <DropdownItem value="YAML - Status" id="yaml-status" icon={<CodeIcon />}>
53
+ YAML - Status
54
+ </DropdownItem>
55
+ <DropdownItem value="YAML - All contents" id="yaml-all" icon={<CodeIcon />}>
56
+ YAML - All contents
57
+ </DropdownItem>
58
+ <Divider key="divider" />
59
+ <DropdownItem value="Upload from computer" id="upload" icon={<UploadIcon />} onClick={open}>
60
+ Upload from computer
61
+ </DropdownItem>
62
+ </DropdownList>
63
+ );
64
+
65
+ const secondMenuItems: ReactNode = (
66
+ <DropdownList>
67
+ <DropdownItem value="canvas" id="canvas">
68
+ {showCanvasLabel ? 'Disable' : 'Enable'} Canvas
69
+ </DropdownItem>
70
+ <Divider key="divider-1" />
71
+ <DropdownItem value="Logs" id="logs" icon={<ClipboardIcon />}>
72
+ Logs
73
+ </DropdownItem>
74
+ <DropdownItem value="YAML - Status" id="yaml-status" icon={<CodeIcon />}>
75
+ YAML - Status
76
+ </DropdownItem>
77
+ <DropdownItem value="YAML - All contents" id="yaml-all" icon={<CodeIcon />}>
78
+ YAML - All contents
79
+ </DropdownItem>
80
+ <Divider key="divider-2" />
81
+ <DropdownItem value="Upload from computer" id="upload" icon={<UploadIcon />} onClick={open}>
82
+ Upload from computer
83
+ </DropdownItem>
84
+ </DropdownList>
85
+ );
86
+
87
+ const modelOptions = ['GPT-4', 'GPT-3.5', 'Claude', 'Llama 2'];
88
+
89
+ return (
90
+ <>
91
+ {/* This is required for react-dropzone to work in Safari and Firefox */}
92
+ <input {...getInputProps()} hidden />
93
+ <div style={{ marginBottom: '1rem' }}>
94
+ <h4 style={{ marginBottom: '0.5rem' }}>Custom attach menu with a PlusIcon at the start</h4>
95
+ <MessageBar
96
+ onSendMessage={handleSend}
97
+ attachButtonPosition="start"
98
+ attachMenuProps={{
99
+ isAttachMenuOpen: isFirstMenuOpen,
100
+ setIsAttachMenuOpen: setIsFirstMenuOpen,
101
+ attachMenuItems: firstMenuItems,
102
+ onAttachMenuSelect: (_ev, value) => {
103
+ // eslint-disable-next-line no-console
104
+ console.log('selected', value);
105
+ setIsFirstMenuOpen(false);
106
+ },
107
+ attachMenuInputPlaceholder: 'Search options...',
108
+ onAttachMenuToggleClick: onFirstMenuToggle,
109
+ onAttachMenuOnOpenChangeKeys: ['Escape', 'Tab']
110
+ }}
111
+ buttonProps={{
112
+ attach: {
113
+ icon: <PlusIcon />,
114
+ tooltipContent: 'Message actions',
115
+ 'aria-label': 'Message actions'
116
+ }
117
+ }}
118
+ />
119
+ </div>
120
+
121
+ <div>
122
+ <h4 style={{ marginBottom: '0.5rem' }}>Custom attach menu with additional actions</h4>
123
+ <MessageBar
124
+ onSendMessage={handleSend}
125
+ attachButtonPosition="start"
126
+ attachMenuProps={{
127
+ isAttachMenuOpen: isSecondMenuOpen,
128
+ setIsAttachMenuOpen: setIsSecondMenuOpen,
129
+ attachMenuItems: secondMenuItems,
130
+ onAttachMenuOnOpenChangeKeys: ['Escape', 'Tab'],
131
+ onAttachMenuSelect: (_ev, value) => {
132
+ // eslint-disable-next-line no-console
133
+ console.log('selected', value);
134
+ if (value === 'canvas') {
135
+ setShowCanvasLabel(!showCanvasLabel);
136
+ }
137
+ setIsSecondMenuOpen(false);
138
+ },
139
+ onAttachMenuToggleClick: onSecondMenuToggle
140
+ }}
141
+ buttonProps={{
142
+ attach: {
143
+ icon: <PlusIcon />,
144
+ tooltipContent: 'Message actions',
145
+ 'aria-label': 'Message actions'
146
+ }
147
+ }}
148
+ additionalActions={
149
+ <>
150
+ <Select
151
+ isOpen={isModelSelectOpen}
152
+ selected={selectedModel}
153
+ shouldFocusToggleOnSelect
154
+ onSelect={onModelSelect}
155
+ onOpenChange={(isOpen) => setIsModelSelectOpen(isOpen)}
156
+ toggle={(toggleRef) => (
157
+ <MenuToggle
158
+ ref={toggleRef}
159
+ variant="plainText"
160
+ onClick={() => setIsModelSelectOpen(!isModelSelectOpen)}
161
+ isExpanded={isModelSelectOpen}
162
+ aria-label={`${selectedModel}, Select a model`}
163
+ style={{
164
+ minWidth: '120px'
165
+ }}
166
+ >
167
+ {selectedModel}
168
+ </MenuToggle>
169
+ )}
170
+ >
171
+ <SelectList>
172
+ {modelOptions.map((option) => (
173
+ <SelectOption key={option} value={option}>
174
+ {option}
175
+ </SelectOption>
176
+ ))}
177
+ </SelectList>
178
+ </Select>
179
+ {showCanvasLabel && (
180
+ <Label closeBtnAriaLabel="Remove Canvas mode" onClose={() => setShowCanvasLabel(false)}>
181
+ Canvas
182
+ </Label>
183
+ )}
184
+ </>
185
+ }
186
+ />
187
+ </div>
188
+ </>
189
+ );
190
+ };
@@ -0,0 +1,15 @@
1
+ import { FunctionComponent, useState } from 'react';
2
+ import { MessageBar } from '@patternfly/chatbot/dist/dynamic/MessageBar';
3
+
4
+ export const ChatbotMessageBarIndicatorThinking: FunctionComponent = () => {
5
+ const [isThinking, setIsThinking] = useState(false);
6
+ const handleSend = (_message: string | number) => {
7
+ setIsThinking(true);
8
+
9
+ setTimeout(() => {
10
+ setIsThinking(false);
11
+ }, 10000);
12
+ };
13
+
14
+ return <MessageBar onSendMessage={handleSend} hasAiIndicator isThinking={isThinking} />;
15
+ };
@@ -0,0 +1,141 @@
1
+ import {
2
+ useRef,
3
+ useState,
4
+ FunctionComponent,
5
+ MouseEvent,
6
+ CSSProperties,
7
+ Ref,
8
+ MouseEvent as ReactMouseEvent
9
+ } from 'react';
10
+ import {
11
+ Button,
12
+ SkipToContent,
13
+ MenuToggle,
14
+ MenuToggleElement,
15
+ Select,
16
+ SelectList,
17
+ SelectOption,
18
+ Stack
19
+ } from '@patternfly/react-core';
20
+ import Onboarding from '@patternfly/chatbot/dist/dynamic/Onboarding';
21
+ import Chatbot, { ChatbotDisplayMode } from '@patternfly/chatbot/dist/dynamic/Chatbot';
22
+
23
+ export const OnboardingExample: FunctionComponent = () => {
24
+ const [isModalOpen, setIsModalOpen] = useState(true);
25
+ const [displayMode, setDisplayMode] = useState(ChatbotDisplayMode.default);
26
+ const chatbotRef = useRef<HTMLDivElement>(null);
27
+ const termsRef = useRef<HTMLDivElement>(null);
28
+ const [isOpen, setIsOpen] = useState(false);
29
+ const [selected, setSelected] = useState<string>('Select display mode');
30
+
31
+ const handleSkipToContent = (e) => {
32
+ e.preventDefault();
33
+ if (!isModalOpen && chatbotRef.current) {
34
+ chatbotRef.current.focus();
35
+ }
36
+ if (isModalOpen && termsRef.current) {
37
+ termsRef.current.focus();
38
+ }
39
+ };
40
+
41
+ const handleModalToggle = (_event: MouseEvent | MouseEvent | KeyboardEvent) => {
42
+ setIsModalOpen(!isModalOpen);
43
+ };
44
+
45
+ const onPrimaryAction = () => {
46
+ // eslint-disable-next-line no-console
47
+ console.log('Clicked primary action');
48
+ };
49
+
50
+ const onSecondaryAction = () => {
51
+ // eslint-disable-next-line no-console
52
+ console.log('Clicked secondary action');
53
+ };
54
+ const onSelect = (_event: ReactMouseEvent<Element, MouseEvent> | undefined, value: string | number | undefined) => {
55
+ setSelected(value as string);
56
+ setIsOpen(false);
57
+ if (value === 'Default') {
58
+ setDisplayMode(ChatbotDisplayMode.default);
59
+ }
60
+ if (value === 'Docked') {
61
+ setDisplayMode(ChatbotDisplayMode.docked);
62
+ }
63
+ if (value === 'Fullscreen') {
64
+ setDisplayMode(ChatbotDisplayMode.fullscreen);
65
+ }
66
+ if (value === 'Embedded') {
67
+ setDisplayMode(ChatbotDisplayMode.embedded);
68
+ }
69
+ };
70
+
71
+ const onToggleClick = () => {
72
+ setIsOpen(!isOpen);
73
+ };
74
+
75
+ const toggle = (toggleRef: Ref<MenuToggleElement>) => (
76
+ <MenuToggle
77
+ ref={toggleRef}
78
+ onClick={onToggleClick}
79
+ isExpanded={isOpen}
80
+ style={
81
+ {
82
+ width: '200px'
83
+ } as CSSProperties
84
+ }
85
+ aria-label={selected === 'Select display mode' ? 'Select display mode' : `Display mode, ${selected}`}
86
+ >
87
+ {selected}
88
+ </MenuToggle>
89
+ );
90
+
91
+ const body = 'Simplify your Red Hat journey with personalized assistance and seamless problem-solving.';
92
+
93
+ return (
94
+ <>
95
+ <SkipToContent style={{ zIndex: '999' }} onClick={handleSkipToContent} href="#">
96
+ Skip to chatbot
97
+ </SkipToContent>
98
+ <div
99
+ style={{
100
+ position: 'fixed',
101
+ padding: 'var(--pf-t--global--spacer--lg)',
102
+ zIndex: '601',
103
+ boxShadow: 'var(--pf-t--global--box-shadow--lg)'
104
+ }}
105
+ >
106
+ <Stack hasGutter>
107
+ <Select
108
+ id="single-select"
109
+ isOpen={isOpen}
110
+ selected={selected}
111
+ onSelect={onSelect}
112
+ onOpenChange={(isOpen) => setIsOpen(isOpen)}
113
+ toggle={toggle}
114
+ shouldFocusToggleOnSelect
115
+ >
116
+ <SelectList>
117
+ <SelectOption value="Default">Default</SelectOption>
118
+ <SelectOption value="Docked">Docked</SelectOption>
119
+ <SelectOption value="Fullscreen">Fullscreen</SelectOption>
120
+ <SelectOption value="Embedded">Embedded</SelectOption>
121
+ </SelectList>
122
+ </Select>
123
+ <Button onClick={handleModalToggle}>Toggle modal</Button>
124
+ </Stack>
125
+ </div>
126
+ <Chatbot ref={chatbotRef} displayMode={displayMode} isVisible isCompact></Chatbot>
127
+ <Onboarding
128
+ ref={termsRef}
129
+ displayMode={displayMode}
130
+ isModalOpen={isModalOpen}
131
+ handleModalToggle={handleModalToggle}
132
+ onPrimaryAction={onPrimaryAction}
133
+ onSecondaryAction={onSecondaryAction}
134
+ title="Redefine work in the age of AI"
135
+ isCompact
136
+ >
137
+ {body}
138
+ </Onboarding>
139
+ </>
140
+ );
141
+ };
@@ -0,0 +1,151 @@
1
+ import {
2
+ useRef,
3
+ useState,
4
+ FunctionComponent,
5
+ MouseEvent,
6
+ CSSProperties,
7
+ Ref,
8
+ MouseEvent as ReactMouseEvent
9
+ } from 'react';
10
+ import {
11
+ Button,
12
+ Checkbox,
13
+ SkipToContent,
14
+ MenuToggle,
15
+ MenuToggleElement,
16
+ Select,
17
+ SelectList,
18
+ SelectOption,
19
+ Stack
20
+ } from '@patternfly/react-core';
21
+ import Onboarding from '@patternfly/chatbot/dist/dynamic/Onboarding';
22
+ import Chatbot, { ChatbotDisplayMode } from '@patternfly/chatbot/dist/dynamic/Chatbot';
23
+ import onboardingHeader from './RH-Hat-Image.svg';
24
+
25
+ export const OnboardingExample: FunctionComponent = () => {
26
+ const [isModalOpen, setIsModalOpen] = useState(true);
27
+ const [displayMode, setDisplayMode] = useState(ChatbotDisplayMode.default);
28
+ const [hasImage, setHasImage] = useState(true);
29
+ const chatbotRef = useRef<HTMLDivElement>(null);
30
+ const termsRef = useRef<HTMLDivElement>(null);
31
+ const [isOpen, setIsOpen] = useState(false);
32
+ const [selected, setSelected] = useState<string>('Select display mode');
33
+
34
+ const handleSkipToContent = (e) => {
35
+ e.preventDefault();
36
+ if (!isModalOpen && chatbotRef.current) {
37
+ chatbotRef.current.focus();
38
+ }
39
+ if (isModalOpen && termsRef.current) {
40
+ termsRef.current.focus();
41
+ }
42
+ };
43
+
44
+ const handleModalToggle = (_event: MouseEvent | MouseEvent | KeyboardEvent) => {
45
+ setIsModalOpen(!isModalOpen);
46
+ };
47
+
48
+ const onPrimaryAction = () => {
49
+ // eslint-disable-next-line no-console
50
+ console.log('Clicked primary action');
51
+ };
52
+
53
+ const onSecondaryAction = () => {
54
+ // eslint-disable-next-line no-console
55
+ console.log('Clicked secondary action');
56
+ };
57
+ const onSelect = (_event: ReactMouseEvent<Element, MouseEvent> | undefined, value: string | number | undefined) => {
58
+ setSelected(value as string);
59
+ setIsOpen(false);
60
+ if (value === 'Default') {
61
+ setDisplayMode(ChatbotDisplayMode.default);
62
+ }
63
+ if (value === 'Docked') {
64
+ setDisplayMode(ChatbotDisplayMode.docked);
65
+ }
66
+ if (value === 'Fullscreen') {
67
+ setDisplayMode(ChatbotDisplayMode.fullscreen);
68
+ }
69
+ if (value === 'Embedded') {
70
+ setDisplayMode(ChatbotDisplayMode.embedded);
71
+ }
72
+ };
73
+
74
+ const onToggleClick = () => {
75
+ setIsOpen(!isOpen);
76
+ };
77
+
78
+ const toggle = (toggleRef: Ref<MenuToggleElement>) => (
79
+ <MenuToggle
80
+ ref={toggleRef}
81
+ onClick={onToggleClick}
82
+ isExpanded={isOpen}
83
+ style={
84
+ {
85
+ width: '200px'
86
+ } as CSSProperties
87
+ }
88
+ aria-label={selected === 'Select display mode' ? 'Select display mode' : `Display mode, ${selected}`}
89
+ >
90
+ {selected}
91
+ </MenuToggle>
92
+ );
93
+
94
+ const body = 'Simplify your Red Hat journey with personalized assistance and seamless problem-solving.';
95
+
96
+ return (
97
+ <>
98
+ <SkipToContent style={{ zIndex: '999' }} onClick={handleSkipToContent} href="#">
99
+ Skip to chatbot
100
+ </SkipToContent>
101
+ <div
102
+ style={{
103
+ position: 'fixed',
104
+ padding: 'var(--pf-t--global--spacer--lg)',
105
+ zIndex: '601',
106
+ boxShadow: 'var(--pf-t--global--box-shadow--lg)'
107
+ }}
108
+ >
109
+ <Stack hasGutter>
110
+ <Select
111
+ id="single-select"
112
+ isOpen={isOpen}
113
+ selected={selected}
114
+ onSelect={onSelect}
115
+ onOpenChange={(isOpen) => setIsOpen(isOpen)}
116
+ toggle={toggle}
117
+ shouldFocusToggleOnSelect
118
+ >
119
+ <SelectList>
120
+ <SelectOption value="Default">Default</SelectOption>
121
+ <SelectOption value="Docked">Docked</SelectOption>
122
+ <SelectOption value="Fullscreen">Fullscreen</SelectOption>
123
+ <SelectOption value="Embedded">Embedded</SelectOption>
124
+ </SelectList>
125
+ </Select>
126
+ <Checkbox
127
+ isChecked={hasImage}
128
+ id="toggle-header-image"
129
+ name="toggle-header-image"
130
+ label="Has image in header"
131
+ onChange={(_event, checked) => setHasImage(checked)}
132
+ ></Checkbox>
133
+ <Button onClick={handleModalToggle}>Toggle modal</Button>
134
+ </Stack>
135
+ </div>
136
+ <Chatbot ref={chatbotRef} displayMode={displayMode} isVisible></Chatbot>
137
+ <Onboarding
138
+ ref={termsRef}
139
+ displayMode={displayMode}
140
+ isModalOpen={isModalOpen}
141
+ handleModalToggle={handleModalToggle}
142
+ onPrimaryAction={onPrimaryAction}
143
+ onSecondaryAction={onSecondaryAction}
144
+ headerImage={hasImage ? onboardingHeader : undefined}
145
+ title="Redefine work in the age of AI"
146
+ >
147
+ {body}
148
+ </Onboarding>
149
+ </>
150
+ );
151
+ };