@patternfly/chatbot 6.5.0 → 6.6.0-prerelease.2

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 (33) hide show
  1. package/dist/cjs/DeepThinking/DeepThinking.d.ts +5 -1
  2. package/dist/cjs/DeepThinking/DeepThinking.js +2 -2
  3. package/dist/cjs/DeepThinking/DeepThinking.test.js +18 -0
  4. package/dist/cjs/MessageBar/MessageBar.d.ts +6 -0
  5. package/dist/cjs/MessageBar/MessageBar.js +29 -12
  6. package/dist/cjs/MessageBar/MessageBar.test.js +12 -0
  7. package/dist/css/main.css +13 -1
  8. package/dist/css/main.css.map +1 -1
  9. package/dist/esm/DeepThinking/DeepThinking.d.ts +5 -1
  10. package/dist/esm/DeepThinking/DeepThinking.js +4 -4
  11. package/dist/esm/DeepThinking/DeepThinking.test.js +18 -0
  12. package/dist/esm/MessageBar/MessageBar.d.ts +6 -0
  13. package/dist/esm/MessageBar/MessageBar.js +29 -12
  14. package/dist/esm/MessageBar/MessageBar.test.js +12 -0
  15. package/package.json +1 -1
  16. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +57 -19
  17. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithDeepThinking.tsx +13 -0
  18. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarCustomActions.tsx +190 -0
  19. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +15 -2
  20. package/patternfly-docs/content/extensions/chatbot/img/custom-source-card.svg +37 -0
  21. package/patternfly-docs/content/extensions/chatbot/img/new-chat-in-nav.svg +21 -0
  22. package/patternfly-docs/content/extensions/chatbot/img/source-card-expanded.svg +141 -0
  23. package/patternfly-docs/content/extensions/chatbot/img/source-card-summary.svg +83 -0
  24. package/patternfly-docs/content/extensions/chatbot/img/source-card.svg +76 -0
  25. package/patternfly-docs/content/extensions/chatbot/img/source-tile-expanded.svg +134 -0
  26. package/patternfly-docs/content/extensions/chatbot/img/source-tile-summary.svg +82 -0
  27. package/patternfly-docs/content/extensions/chatbot/img/source-tile.svg +30 -17
  28. package/patternfly-docs/content/extensions/chatbot/img/starting-new-chat.svg +57 -0
  29. package/src/DeepThinking/DeepThinking.test.tsx +23 -0
  30. package/src/DeepThinking/DeepThinking.tsx +16 -3
  31. package/src/MessageBar/MessageBar.scss +15 -1
  32. package/src/MessageBar/MessageBar.test.tsx +27 -0
  33. package/src/MessageBar/MessageBar.tsx +92 -50
@@ -16,7 +16,7 @@ import "./images.css"
16
16
 
17
17
  1. **Container:** The window that contains the entire ChatBot experience and all of its components.
18
18
  1. **Header:** A persistent region at the top of the ChatBot window that contains navigation, branding, and actions.
19
- 1. **History menu:** A menu that contains a conversation history of previous chats.
19
+ 1. **Chat history menu:** A menu that contains a history of previous chats.
20
20
  1. **Options menu:** A menu that contains settings that are relevant to your product. This typically includes display options (more details in the [ChatBot variations section](#variations)) and other general settings (more details in the [ChatBot settings and preferences section](#chatbot-settings-and-preferences)).
21
21
  1. **Messages:** Elements of the conversation between a ChatBot and user. More details can be found in the [message guidelines](#messages).
22
22
  1. **Attachments:** Details about files that a user has uploaded to the ChatBot.
@@ -43,7 +43,7 @@ import "./images.css"
43
43
 
44
44
  At the start of a new chat, you should welcome your users to the ChatBot with a greeting.
45
45
 
46
- If you have user details from their account information, you can personalize this greeting with their username or name. If you don't have this information, or if you'd prefer to not use their personal details, you should instead introduce the ChatBot:
46
+ As much as possible, the suggested prompts should consider the user’s location in the service or application, or the situation their project is undergoing. If you have user details from their account information, you can personalize this greeting with their username or name. If you don't have this information, or if you'd prefer to not use their personal details, you should instead introduce the ChatBot:
47
47
 
48
48
  <div class="ws-docs-content-img">
49
49
  ![Welcome messages.](./img/welcome-message.svg)
@@ -55,16 +55,44 @@ To help users get started quickly, it can also be helpful to include welcome pro
55
55
  ![Welcome message with prompts.](./img/welcome-elements.svg)
56
56
  </div>
57
57
 
58
- #### Source tiles
58
+ #### Source cards
59
59
 
60
- A ChatBot can share relevant sources with users, like documentation that could provide the information a user is searching for. These sources will be contained in a single tile, which users can paginate through and select to navigate to other resources.
60
+ To share relevant resources with users, like documentation containing the answer to a user's question, you can use source cards.
61
61
 
62
- To provide users with enough context, sources should have descriptive titles and descriptions. The title is limited to 1 line and the body is limited to 2 lines.
62
+ <div class="ws-docs-content-img">
63
+ ![A white card below a message from a ChatBot. In the card is blue text for the title and black text for a short description. There are four pink annotation markers pointing to major sections of the image.](./img/source-card.svg)
64
+ </div>
65
+
66
+ 1. **Source count:** Notes the number of sources shared in a card.
67
+ 2. **Source card title:** Offers a concise, descriptive title of the source content to provide users with quick context about a source. Titles are limited to 1 line and should be truncated when the text overflows or wraps.
68
+ 3. **Source card description:** Offers a concise preview or summary of the source content. We recommend limiting the length to 2 lines to provide context without overcrowding the chat window.
69
+ 4. **Pagination:** Used to navigate through all options when there are multiple source cards provided. Not displayed when only 1 source is provided.
70
+
71
+ Instead of a short preview of the linked source's content, you can choose to summarize the contents and use that summary as your description. This is helpful for in-depth resources where the context is not clear from the beginning snippet. You can also choose to elevate a quote from the resource that is most relevant to the user's question.
63
72
 
64
73
  <div class="ws-docs-content-img">
65
- ![Bot message that include multiple source tiles.](./img/source-tile.svg)
74
+ ![A single source card is show below a chatbot message.](./img/source-card-summary.svg)
66
75
  </div>
67
76
 
77
+ While we generally recommend staying within 2 lines for your source description, you can choose to provide a "show more" button that allows users to expand and view a longer description. When using expandable descriptions, it is recommended to end the description at the end of the sentence. Use your best UX judgment here&mdash;extremely lengthy descriptions can quickly fill out the chat window and obstruct previous conversation details.
78
+
79
+ <div class="ws-docs-content-img">
80
+ ![A before and after image is shown. The before image shows a single source card below a chatbot message, with a blue link at the bottom that says "show more." In the after image, additional description lines are shown and the link now says "show less."](./img/source-card-expanded.svg)
81
+ </div>
82
+
83
+ ##### Custom source cards
84
+
85
+ You can create a custom source card by utilizing additional components that make sense for your use case. The source card's flexibility can be used in a number of ways, but the following example demonstrates how you might customize its appearance to provide additional details about a source.
86
+
87
+ <div class="ws-docs-content-img">
88
+ ![A source card, annotated with four pink markers. Each marker points to a unique point of the card: a light gray subtitle below the main card title, a filled, green label beneath the card body that is labeled with a confidence % score, a blue help link is to the right of the green label that says "learn about this score", and light gray text at the bottom of the card with the last updated date.](./img/custom-source-card.svg)
89
+ </div>
90
+
91
+ 1. **Subtitle:** Additional context about the resource, such as where the documentation is hosted.
92
+ 2. **Label:** A confidence score, to indicate the likelihood that a source contains relevant information for the user.
93
+ 3. **Link with popover:** Additional context about the confidence score label.
94
+ 4. **Date:** The last time the linked resource was updated.
95
+
68
96
  #### Quick start tiles
69
97
 
70
98
  A ChatBot can share a link to a [quick start](/extensions/quick-starts) that will help users complete a given task. Users can either select **Start** or the tile's title to initiate the linked quick start.
@@ -119,7 +147,7 @@ When users select either of these icons, you should present them with either:
119
147
  1. **Close button (optional):** Closes the feedback form. The original feedback response should still be collected.
120
148
  1. **Quick responses:** Options for users to provide more context around their rating. Customize these to make the most sense for your product. You can present positive and negative options based on the response type originally selected.
121
149
  1. **Text area (optional):** Allows users to provide additional written detail if they'd like.
122
- 1. **Submit button:** Submits the feedback form and triggers the thank-you card.
150
+ 1. **Submit button:** Submits the feedback form and triggers the thank-you card.
123
151
 
124
152
  ### Message bar
125
153
 
@@ -205,7 +233,7 @@ To help users further identify the toggle, add a "Launch ChatBot" tooltip. You c
205
233
  ![Tooltips for ChatBot toggle.](./img/toggle-tooltips.svg)
206
234
  </div>
207
235
 
208
- Whichever method you choose, it is critical to be consistent with the toggle location and refer to the following the additional guidelines for each.
236
+ Whichever method you choose, it is critical to be consistent with the toggle location and refer to the following additional guidelines for each.
209
237
 
210
238
  #### Floating toggle
211
239
  When users click the toggle, the ChatBot window opens and the toggle will change to display an "angle down" icon to indicate that clicking the toggle again will minimize the ChatBot. Users can select the toggle at any point in their journey to open and close the ChatBot as needed.
@@ -250,17 +278,27 @@ If a UI element within the page content is an AI/ChatBot-supported feature, the
250
278
  ![Menu item for an AI action that launches a ChatBot.](./img/ai-action-inpage.svg)
251
279
  </div>
252
280
 
253
- When a ChatBot is launches via an AI-supported action, the action should be sent as a user message once the ChatBot opens.
281
+ When a ChatBot is launched via an AI-supported action, the action should be sent as a user message once the ChatBot opens.
254
282
 
255
283
  <div class="ws-docs-content-img">
256
284
  ![User message in ChatBot for an AI action command.](./img/ai-action-message.svg)
257
285
  </div>
258
286
 
259
- ### Starting a new conversation
287
+ ### Starting a new chat
288
+
289
+ Each time a user begins a new chat, display a [welcome message](#welcome-message), with prompts that provide initial suggestions and indicate the actions that the ChatBot can take.
290
+
291
+ The default approach for users to create a new chat is by clicking the "New chat" button (which contains a "pen to square" icon) placed at the top of the [chat history menu](#using-the-chat-history-menu).
260
292
 
261
- Each time a user begins a new conversation, display a [welcome message, with prompts](#welcome-message) that help them learn what the ChatBot can help with.
293
+ <div class="ws-docs-content-img">
294
+ ![A blue "New chat" button at the top right of a drawer labeled "Chat history".](./img/new-chat-in-nav.svg)
295
+ </div>
296
+
297
+ Alternatively, you can choose to surface the "New chat" button as an icon button in the header. For this approach, the "pen to square" icon is displayed in the button and a "New chat" tooltip should appear on hover and focus.
262
298
 
263
- As much as possible, the suggested prompts should consider the user’s location in the service or application, or the situation their project is undergoing.
299
+ <div class="ws-docs-content-img">
300
+ ![An icon button is placed at the start of the ChatBot header, prior to a hamburger menu. It contains the visual of a pen placed within a square and is in a hover state, with a darker gray background and a black tooltip that says "New chat."](./img/starting-new-chat.svg)
301
+ </div>
264
302
 
265
303
  ### Executing user requests
266
304
 
@@ -272,9 +310,9 @@ This can be done using the [quick response](/extensions/chatbot/messages#message
272
310
  ![Confirmation options from a bot in response to a user's request.](./img/quick-response-confirmation.svg)
273
311
  </div>
274
312
 
275
- ### Using the conversation history menu
313
+ ### Using the chat history menu
276
314
 
277
- The ChatBot history menu contains a log of a users' previous chats. Clicking the menu icon opens a side drawer in the ChatBot window.
315
+ The ChatBot history menu contains a log of a user's previous chats. Clicking the menu icon opens a side drawer in the ChatBot window.
278
316
 
279
317
  By clicking into the history menu, users can search through previous conversations and perform additional actions, such as sharing a conversation with others.
280
318
 
@@ -282,13 +320,13 @@ By clicking into the history menu, users can search through previous conversatio
282
320
  ![Conversation history with an options menu opened on a previous conversation.](./img/conversation-history.svg)
283
321
  </div>
284
322
 
285
- When the conversation history is still loading, display skeleton items:
323
+ When the chat history is still loading, display skeleton items:
286
324
 
287
325
  <div class="ws-docs-content-img">
288
326
  ![Chat history items loading.](./img/loading-state.svg)
289
327
  </div>
290
328
 
291
- If there's an error loading the conversation history, display an error screen with steps for resolving the error:
329
+ If there's an error loading the chat history, display an error screen with steps for resolving the error:
292
330
 
293
331
  <div class="ws-docs-content-img">
294
332
  ![Error state in chat history.](./img/error-state.svg)
@@ -349,9 +387,9 @@ For guidance, refer to our download transcripts demo, which opens a Markdown fil
349
387
 
350
388
  Choose the download action location that best works for your ChatBot:
351
389
 
352
- #### Download via conversation history drawer
390
+ #### Download via chat history drawer
353
391
 
354
- If your ChatBot uses a conversation history drawer, you can provide a download option in the [actions menu linked to a previous conversation](/extensions/chatbot/ui#drawer-with-conversation-actions).
392
+ If your ChatBot uses a chat history drawer, you can provide a download option in the [actions menu linked to a previous conversation](/extensions/chatbot/ui#drawer-with-conversation-actions).
355
393
 
356
394
  <div class="ws-docs-content-img">
357
395
  ![Expanded menu for previous chat in the history window, which shows a download option.](./img/download-chat-history.svg)
@@ -367,7 +405,7 @@ To allow users to download individual bot messages, the message actions can incl
367
405
 
368
406
  #### Download control in header
369
407
 
370
- If you don't use a conversation history drawer, you can place an option to download the transcript for the active chat within the header options menu.
408
+ If you don't use a chat history drawer, you can place an option to download the transcript for the active chat within the header options menu.
371
409
 
372
410
  <div class="ws-docs-content-img">
373
411
  ![Download transcript action within the ChatBot header options menu.](./img/download-header.svg)
@@ -27,5 +27,18 @@ export const MessageWithDeepThinkingExample: FunctionComponent = () => (
27
27
  body: "Here's why I said this."
28
28
  }}
29
29
  />
30
+ <Message
31
+ name="Bot"
32
+ role="bot"
33
+ avatar={patternflyAvatar}
34
+ content="This example has deep thinking that is loading:"
35
+ deepThinking={{
36
+ isDefaultExpanded: false,
37
+ toggleContent: 'Show thinking',
38
+ subheading: 'Thought for 3 seconds',
39
+ body: "Here's why I said this.",
40
+ isLoading: true
41
+ }}
42
+ />
30
43
  </>
31
44
  );
@@ -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
+ };
@@ -70,11 +70,11 @@ import { MessageBar } from '@patternfly/chatbot/dist/dynamic/MessageBar';
70
70
  import SourceDetailsMenuItem from '@patternfly/chatbot/dist/dynamic/SourceDetailsMenuItem';
71
71
  import { ChatbotModal } from '@patternfly/chatbot/dist/dynamic/ChatbotModal';
72
72
  import SettingsForm from '@patternfly/chatbot/dist/dynamic/Settings';
73
- import { BellIcon, CalendarAltIcon, ClipboardIcon, CodeIcon, ThumbtackIcon, UploadIcon } from '@patternfly/react-icons';
73
+ import { BellIcon, CalendarAltIcon, ClipboardIcon, CodeIcon, PlusIcon, ThumbtackIcon, UploadIcon } from '@patternfly/react-icons';
74
74
  import { useDropzone } from 'react-dropzone';
75
75
 
76
76
  import ChatbotConversationHistoryNav from '@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav';
77
- import { Button, DropdownItem, DropdownList, Checkbox, MenuToggle, Select, SelectList, SelectOption } from '@patternfly/react-core';
77
+ import { Button, Label, DropdownItem, DropdownList, Checkbox, MenuToggle, Select, SelectList, SelectOption } from '@patternfly/react-core';
78
78
 
79
79
  import OutlinedWindowRestoreIcon from '@patternfly/react-icons/dist/esm/icons/outlined-window-restore-icon';
80
80
  import ExpandIcon from '@patternfly/react-icons/dist/esm/icons/expand-icon';
@@ -291,6 +291,19 @@ Attachments can also be added to the ChatBot via [drag and drop.](/extensions/ch
291
291
 
292
292
  ```
293
293
 
294
+ ### Message bar with custom attach menu and additional actions
295
+
296
+ You can move the attach button to the start of the message bar and customize it with a different icon. To include additional actions in the message bar you can also use the `additionalActions` prop.
297
+
298
+ This example shows two message bar variations:
299
+
300
+ 1. A message bar with a custom attach menu where a `PlusIcon` is positioned at the start
301
+ 2. The same custom attach menu with additional actions, including a model selector menu and a dismissable "Canvas" label
302
+
303
+ ```js file="./ChatbotMessageBarCustomActions.tsx"
304
+
305
+ ```
306
+
294
307
  ### Footer with message bar and footnote
295
308
 
296
309
  A simple footer with a message bar and footnote would have this code structure: