@patternfly/chatbot 6.5.0-prerelease.3 → 6.5.0-prerelease.4
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.
- package/dist/cjs/AttachMenu/AttachMenu.d.ts +7 -1
- package/dist/cjs/AttachMenu/AttachMenu.js +2 -2
- package/dist/cjs/ChatbotFooter/ChatbotFooter.d.ts +5 -2
- package/dist/cjs/ChatbotFooter/ChatbotFooter.js +2 -2
- package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +5 -1
- package/dist/cjs/MessageBar/MessageBar.d.ts +9 -1
- package/dist/cjs/MessageBar/MessageBar.js +3 -3
- package/dist/cjs/MessageBar/MessageBar.test.js +37 -0
- package/dist/css/main.css +6 -0
- package/dist/css/main.css.map +1 -1
- package/dist/esm/AttachMenu/AttachMenu.d.ts +7 -1
- package/dist/esm/AttachMenu/AttachMenu.js +2 -2
- package/dist/esm/ChatbotFooter/ChatbotFooter.d.ts +5 -2
- package/dist/esm/ChatbotFooter/ChatbotFooter.js +2 -2
- package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +5 -1
- package/dist/esm/MessageBar/MessageBar.d.ts +9 -1
- package/dist/esm/MessageBar/MessageBar.js +3 -3
- package/dist/esm/MessageBar/MessageBar.test.js +37 -0
- package/package.json +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +12 -4
- package/patternfly-docs/content/extensions/chatbot/examples/demos/WhiteEmbeddedChatbot.tsx +437 -0
- package/src/AttachMenu/AttachMenu.tsx +16 -3
- package/src/ChatbotFooter/ChatbotFooter.scss +4 -0
- package/src/ChatbotFooter/ChatbotFooter.test.tsx +10 -1
- package/src/ChatbotFooter/ChatbotFooter.tsx +10 -3
- package/src/MessageBar/MessageBar.scss +4 -0
- package/src/MessageBar/MessageBar.test.tsx +62 -1
- package/src/MessageBar/MessageBar.tsx +24 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FunctionComponent } from 'react';
|
|
2
|
-
import { DropdownProps, DropdownToggleProps, PopperOptions } from '@patternfly/react-core';
|
|
2
|
+
import { DropdownProps, DropdownToggleProps, PopperOptions, MenuSearchInputProps, SearchInputProps, MenuSearchProps } from '@patternfly/react-core';
|
|
3
3
|
export interface AttachMenuProps extends DropdownProps {
|
|
4
4
|
/** Items in menu */
|
|
5
5
|
filteredItems: React.ReactNode;
|
|
@@ -21,6 +21,12 @@ export interface AttachMenuProps extends DropdownProps {
|
|
|
21
21
|
searchInputAriaLabel?: string;
|
|
22
22
|
/** Toggle to be rendered */
|
|
23
23
|
toggle: DropdownToggleProps | ((toggleRef: React.RefObject<any>) => React.ReactNode);
|
|
24
|
+
/** Additional props passed to MenuSearch component */
|
|
25
|
+
menuSearchProps?: Omit<MenuSearchProps, 'ref'>;
|
|
26
|
+
/** Additional props passed to MenuSearchInput component */
|
|
27
|
+
menuSearchInputProps?: Omit<MenuSearchInputProps, 'ref'>;
|
|
28
|
+
/** Additional props passed to SearchInput component */
|
|
29
|
+
searchInputProps?: SearchInputProps;
|
|
24
30
|
}
|
|
25
31
|
export declare const AttachMenu: FunctionComponent<AttachMenuProps>;
|
|
26
32
|
export default AttachMenu;
|
|
@@ -16,8 +16,8 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
16
16
|
// Import PatternFly components
|
|
17
17
|
const react_core_1 = require("@patternfly/react-core");
|
|
18
18
|
const AttachMenu = (_a) => {
|
|
19
|
-
var { className, filteredItems, handleTextInputChange, isOpen, popperProps = undefined, onOpenChange, onOpenChangeKeys, onSelect, searchInputPlaceholder, searchInputAriaLabel = 'Filter menu items', toggle } = _a, props = __rest(_a, ["className", "filteredItems", "handleTextInputChange", "isOpen", "popperProps", "onOpenChange", "onOpenChangeKeys", "onSelect", "searchInputPlaceholder", "searchInputAriaLabel", "toggle"]);
|
|
20
|
-
return ((0, jsx_runtime_1.jsxs)(react_core_1.Dropdown, Object.assign({ className: `pf-chatbot__menu ${className !== null && className !== void 0 ? className : ''}`, isOpen: isOpen, onOpenChange: (isOpen) => onOpenChange(isOpen), onOpenChangeKeys: onOpenChangeKeys !== null && onOpenChangeKeys !== void 0 ? onOpenChangeKeys : ['Esc'], toggle: toggle, popperProps: popperProps, onSelect: onSelect }, props, { children: [(0, jsx_runtime_1.jsx)(react_core_1.MenuSearch, { children: (0, jsx_runtime_1.jsx)(react_core_1.MenuSearchInput, { children: (0, jsx_runtime_1.jsx)(react_core_1.SearchInput, { "aria-label": searchInputAriaLabel, onChange: (_event, value) => handleTextInputChange(value), placeholder: searchInputPlaceholder }) }) }), filteredItems] })));
|
|
19
|
+
var { className, filteredItems, handleTextInputChange, isOpen, popperProps = undefined, onOpenChange, onOpenChangeKeys, onSelect, searchInputPlaceholder, searchInputAriaLabel = 'Filter menu items', toggle, menuSearchProps, menuSearchInputProps, searchInputProps } = _a, props = __rest(_a, ["className", "filteredItems", "handleTextInputChange", "isOpen", "popperProps", "onOpenChange", "onOpenChangeKeys", "onSelect", "searchInputPlaceholder", "searchInputAriaLabel", "toggle", "menuSearchProps", "menuSearchInputProps", "searchInputProps"]);
|
|
20
|
+
return ((0, jsx_runtime_1.jsxs)(react_core_1.Dropdown, Object.assign({ className: `pf-chatbot__menu ${className !== null && className !== void 0 ? className : ''}`, isOpen: isOpen, onOpenChange: (isOpen) => onOpenChange(isOpen), onOpenChangeKeys: onOpenChangeKeys !== null && onOpenChangeKeys !== void 0 ? onOpenChangeKeys : ['Esc'], toggle: toggle, popperProps: popperProps, onSelect: onSelect }, props, { children: [(0, jsx_runtime_1.jsx)(react_core_1.MenuSearch, Object.assign({}, menuSearchProps, { children: (0, jsx_runtime_1.jsx)(react_core_1.MenuSearchInput, Object.assign({}, menuSearchInputProps, { children: (0, jsx_runtime_1.jsx)(react_core_1.SearchInput, Object.assign({ "aria-label": searchInputAriaLabel, onChange: (_event, value) => handleTextInputChange(value), placeholder: searchInputPlaceholder }, searchInputProps)) })) })), filteredItems] })));
|
|
21
21
|
};
|
|
22
22
|
exports.AttachMenu = AttachMenu;
|
|
23
23
|
exports.default = exports.AttachMenu;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { HTMLProps, FunctionComponent } from 'react';
|
|
2
2
|
export interface ChatbotFooterProps extends HTMLProps<HTMLDivElement> {
|
|
3
|
-
/** Children for the
|
|
3
|
+
/** Children for the footer - supports MessageBar and FootNote components*/
|
|
4
4
|
children?: React.ReactNode;
|
|
5
|
-
/** Custom classname for the
|
|
5
|
+
/** Custom classname for the footer component */
|
|
6
6
|
className?: string;
|
|
7
|
+
/** Sets footer to compact styling. */
|
|
7
8
|
isCompact?: boolean;
|
|
9
|
+
/** Sets background color to primary */
|
|
10
|
+
isPrimary?: boolean;
|
|
8
11
|
}
|
|
9
12
|
export declare const ChatbotFooter: FunctionComponent<ChatbotFooterProps>;
|
|
10
13
|
export default ChatbotFooter;
|
|
@@ -15,8 +15,8 @@ exports.ChatbotFooter = void 0;
|
|
|
15
15
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
16
16
|
const react_core_1 = require("@patternfly/react-core");
|
|
17
17
|
const ChatbotFooter = (_a) => {
|
|
18
|
-
var { children, className, isCompact } = _a, props = __rest(_a, ["children", "className", "isCompact"]);
|
|
19
|
-
return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ className: `pf-chatbot__footer ${isCompact ? 'pf-m-compact' : ''} ${className !== null && className !== void 0 ? className : ''}` }, props, { children: [(0, jsx_runtime_1.jsx)(react_core_1.Divider, {}), (0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__footer-container", children: children })] })));
|
|
18
|
+
var { children, className, isCompact, isPrimary } = _a, props = __rest(_a, ["children", "className", "isCompact", "isPrimary"]);
|
|
19
|
+
return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ className: `pf-chatbot__footer ${isCompact ? 'pf-m-compact' : ''} ${isPrimary ? 'pf-m-primary' : ''} ${className !== null && className !== void 0 ? className : ''}` }, props, { children: [(0, jsx_runtime_1.jsx)(react_core_1.Divider, {}), (0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__footer-container", children: children })] })));
|
|
20
20
|
};
|
|
21
21
|
exports.ChatbotFooter = ChatbotFooter;
|
|
22
22
|
exports.default = exports.ChatbotFooter;
|
|
@@ -17,7 +17,11 @@ describe('ChatbotFooter', () => {
|
|
|
17
17
|
expect(container.querySelector('.custom-class')).toBeTruthy();
|
|
18
18
|
});
|
|
19
19
|
it('should handle isCompact', () => {
|
|
20
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(ChatbotFooter_1.default, {
|
|
20
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(ChatbotFooter_1.default, { isCompact: true, "data-testid": "footer", children: "Chatbot Content" }));
|
|
21
21
|
expect(react_1.screen.getByTestId('footer')).toHaveClass('pf-m-compact');
|
|
22
22
|
});
|
|
23
|
+
it('should handle isPrimary', () => {
|
|
24
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(ChatbotFooter_1.default, { isPrimary: true, "data-testid": "footer", children: "Chatbot Content" }));
|
|
25
|
+
expect(react_1.screen.getByTestId('footer')).toHaveClass('pf-m-primary');
|
|
26
|
+
});
|
|
23
27
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { FunctionComponent } from 'react';
|
|
2
2
|
import { Accept, DropEvent, DropzoneOptions, FileError, FileRejection } from 'react-dropzone';
|
|
3
|
-
import { ButtonProps, TextAreaProps, TooltipProps } from '@patternfly/react-core';
|
|
3
|
+
import { ButtonProps, MenuSearchInputProps, MenuSearchProps, SearchInputProps, TextAreaProps, TooltipProps } from '@patternfly/react-core';
|
|
4
4
|
import { ChatbotDisplayMode } from '../Chatbot';
|
|
5
5
|
export interface MessageBarWithAttachMenuProps {
|
|
6
6
|
/** Flag to enable whether attach menu is open */
|
|
@@ -21,6 +21,12 @@ export interface MessageBarWithAttachMenuProps {
|
|
|
21
21
|
onAttachMenuOnOpenChangeKeys?: string[];
|
|
22
22
|
/** Callback to change the open state of the menu. Triggered by clicking outside of the menu. */
|
|
23
23
|
onAttachMenuOpenChange?: (isOpen: boolean) => void;
|
|
24
|
+
/** Additional props passed to MenuSearch component in attach menu */
|
|
25
|
+
menuSearchProps?: Omit<MenuSearchProps, 'ref'>;
|
|
26
|
+
/** Additional props passed to MenuSearchInput component in attach menu */
|
|
27
|
+
menuSearchInputProps?: Omit<MenuSearchInputProps, 'ref'>;
|
|
28
|
+
/** Additional props passed to SearchInput component in attach menu */
|
|
29
|
+
searchInputProps?: SearchInputProps;
|
|
24
30
|
}
|
|
25
31
|
export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
|
|
26
32
|
/** Callback to get the value of input message by user */
|
|
@@ -105,6 +111,8 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
|
|
|
105
111
|
isCompact?: boolean;
|
|
106
112
|
/** Ref applied to message bar textarea, for use with focus or other custom behaviors */
|
|
107
113
|
innerRef?: React.Ref<HTMLTextAreaElement>;
|
|
114
|
+
/** Sets background color to primary */
|
|
115
|
+
isPrimary?: boolean;
|
|
108
116
|
}
|
|
109
117
|
export declare const MessageBarBase: FunctionComponent<MessageBarProps>;
|
|
110
118
|
declare const MessageBar: import("react").ForwardRefExoticComponent<MessageBarProps & import("react").RefAttributes<HTMLTextAreaElement>>;
|
|
@@ -26,7 +26,7 @@ const AttachMenu_1 = __importDefault(require("../AttachMenu"));
|
|
|
26
26
|
const StopButton_1 = __importDefault(require("./StopButton"));
|
|
27
27
|
const MessageBarBase = (_a) => {
|
|
28
28
|
var _b;
|
|
29
|
-
var { onSendMessage, className, alwayShowSendButton, placeholder = 'Send a message...', hasAttachButton = true, hasMicrophoneButton, listeningText = 'Listening', handleAttach, attachMenuProps, isSendButtonDisabled, handleStopButton, hasStopButton, buttonProps, onChange, displayMode, value, isCompact = false, allowedFileTypes, minSize, maxSize, maxFiles, isAttachmentDisabled, onAttach, onAttachRejected, validator, dropzoneProps, innerRef } = _a, props = __rest(_a, ["onSendMessage", "className", "alwayShowSendButton", "placeholder", "hasAttachButton", "hasMicrophoneButton", "listeningText", "handleAttach", "attachMenuProps", "isSendButtonDisabled", "handleStopButton", "hasStopButton", "buttonProps", "onChange", "displayMode", "value", "isCompact", "allowedFileTypes", "minSize", "maxSize", "maxFiles", "isAttachmentDisabled", "onAttach", "onAttachRejected", "validator", "dropzoneProps", "innerRef"]);
|
|
29
|
+
var { onSendMessage, className, alwayShowSendButton, placeholder = 'Send a message...', hasAttachButton = true, hasMicrophoneButton, listeningText = 'Listening', handleAttach, attachMenuProps, isSendButtonDisabled, handleStopButton, hasStopButton, buttonProps, onChange, displayMode, value, isCompact = false, allowedFileTypes, minSize, maxSize, maxFiles, isAttachmentDisabled, onAttach, onAttachRejected, validator, dropzoneProps, innerRef, isPrimary } = _a, props = __rest(_a, ["onSendMessage", "className", "alwayShowSendButton", "placeholder", "hasAttachButton", "hasMicrophoneButton", "listeningText", "handleAttach", "attachMenuProps", "isSendButtonDisabled", "handleStopButton", "hasStopButton", "buttonProps", "onChange", "displayMode", "value", "isCompact", "allowedFileTypes", "minSize", "maxSize", "maxFiles", "isAttachmentDisabled", "onAttach", "onAttachRejected", "validator", "dropzoneProps", "innerRef", "isPrimary"]);
|
|
30
30
|
// Text Input
|
|
31
31
|
// --------------------------------------------------------------------------
|
|
32
32
|
const [message, setMessage] = (0, react_1.useState)(value !== null && value !== void 0 ? value : '');
|
|
@@ -206,9 +206,9 @@ const MessageBarBase = (_a) => {
|
|
|
206
206
|
(_a = attachButtonRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
207
207
|
attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.setIsAttachMenuOpen(isAttachMenuOpen);
|
|
208
208
|
(attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuOpenChange) && (attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuOpenChange(isAttachMenuOpen));
|
|
209
|
-
}, onOpenChangeKeys: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuOnOpenChangeKeys, onSelect: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuSelect }, (attachMenuProps && { handleTextInputChange: attachMenuProps.onAttachMenuInputChange }), { popperProps: { direction: 'up', distance: 8 }, searchInputPlaceholder: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.attachMenuInputPlaceholder })));
|
|
209
|
+
}, onOpenChangeKeys: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuOnOpenChangeKeys, onSelect: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuSelect }, (attachMenuProps && { handleTextInputChange: attachMenuProps.onAttachMenuInputChange }), { popperProps: { direction: 'up', distance: 8 }, searchInputPlaceholder: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.attachMenuInputPlaceholder }, attachMenuProps)));
|
|
210
210
|
}
|
|
211
|
-
return (0, jsx_runtime_1.jsx)("div", { className: `pf-chatbot__message-bar ${className !== null && className !== void 0 ? className : ''}`, children: messageBarContents });
|
|
211
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `pf-chatbot__message-bar ${isPrimary ? 'pf-m-primary' : ''} ${className !== null && className !== void 0 ? className : ''}`, children: messageBarContents }));
|
|
212
212
|
};
|
|
213
213
|
exports.MessageBarBase = MessageBarBase;
|
|
214
214
|
const MessageBar = (0, react_1.forwardRef)((props, ref) => ((0, jsx_runtime_1.jsx)(exports.MessageBarBase, Object.assign({ innerRef: ref }, props))));
|
|
@@ -159,6 +159,39 @@ describe('Message bar', () => {
|
|
|
159
159
|
yield user_event_1.default.click(attachButton);
|
|
160
160
|
expect(attachToggleClickSpy).toHaveBeenCalledTimes(1);
|
|
161
161
|
}));
|
|
162
|
+
it('can pass searchInputProps to search input in AttachMenu', () => {
|
|
163
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(MessageBar_1.MessageBar, { onSendMessage: jest.fn, value: "test", attachMenuProps: {
|
|
164
|
+
isAttachMenuOpen: true,
|
|
165
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
166
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
167
|
+
onAttachMenuInputChange: jest.fn(),
|
|
168
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
169
|
+
searchInputProps: { isDisabled: true }
|
|
170
|
+
} }));
|
|
171
|
+
expect(react_1.screen.getByRole('textbox', { name: /Filter menu items/i })).toBeDisabled();
|
|
172
|
+
});
|
|
173
|
+
it('can pass menuSearchProps to search input in AttachMenu', () => {
|
|
174
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(MessageBar_1.MessageBar, { onSendMessage: jest.fn, value: "test", attachMenuProps: {
|
|
175
|
+
isAttachMenuOpen: true,
|
|
176
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
177
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
178
|
+
onAttachMenuInputChange: jest.fn(),
|
|
179
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
180
|
+
menuSearchProps: { 'data-testid': 'menu-search' }
|
|
181
|
+
} }));
|
|
182
|
+
expect(react_1.screen.getByTestId('menu-search')).toBeTruthy();
|
|
183
|
+
});
|
|
184
|
+
it('can pass menuSearchInputProps to search input in AttachMenu', () => {
|
|
185
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(MessageBar_1.MessageBar, { onSendMessage: jest.fn, value: "test", attachMenuProps: {
|
|
186
|
+
isAttachMenuOpen: true,
|
|
187
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
188
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
189
|
+
onAttachMenuInputChange: jest.fn(),
|
|
190
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
191
|
+
menuSearchInputProps: { 'data-testid': 'menu-search-input' }
|
|
192
|
+
} }));
|
|
193
|
+
expect(react_1.screen.getByTestId('menu-search-input')).toBeTruthy();
|
|
194
|
+
});
|
|
162
195
|
it('can hide attach button', () => {
|
|
163
196
|
(0, react_1.render)((0, jsx_runtime_1.jsx)(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasAttachButton: false }));
|
|
164
197
|
expect(react_1.screen.queryByRole('button', { name: 'Attach' })).toBeFalsy();
|
|
@@ -269,4 +302,8 @@ describe('Message bar', () => {
|
|
|
269
302
|
(_a = ref.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
270
303
|
expect(document.activeElement).toBe(react_1.screen.getByRole('textbox'));
|
|
271
304
|
});
|
|
305
|
+
it('should handle isPrimary', () => {
|
|
306
|
+
const { container } = (0, react_1.render)((0, jsx_runtime_1.jsx)(MessageBar_1.MessageBar, { isPrimary: true, onSendMessage: jest.fn }));
|
|
307
|
+
expect(container.querySelector('.pf-m-primary')).toBeTruthy();
|
|
308
|
+
});
|
|
272
309
|
});
|
package/dist/css/main.css
CHANGED
|
@@ -413,6 +413,9 @@
|
|
|
413
413
|
row-gap: var(--pf-chatbot__footer--RowGap);
|
|
414
414
|
position: relative;
|
|
415
415
|
}
|
|
416
|
+
.pf-chatbot__footer.pf-m-primary {
|
|
417
|
+
background-color: var(--pf-t--global--background--color--primary--default);
|
|
418
|
+
}
|
|
416
419
|
|
|
417
420
|
.pf-chatbot__footer-container {
|
|
418
421
|
padding: 0 var(--pf-t--global--spacer--lg) var(--pf-t--global--spacer--lg) var(--pf-t--global--spacer--lg);
|
|
@@ -2064,6 +2067,9 @@ li[id*=user-content-fn-]:has(> span > span > .pf-chatbot__message-text + .pf-cha
|
|
|
2064
2067
|
transition: box-shadow var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--sm);
|
|
2065
2068
|
overflow: hidden;
|
|
2066
2069
|
}
|
|
2070
|
+
.pf-chatbot__message-bar.pf-m-primary {
|
|
2071
|
+
box-shadow: inset 0 0 0 1px var(--pf-t--global--border--color--default);
|
|
2072
|
+
}
|
|
2067
2073
|
.pf-chatbot__message-bar:hover {
|
|
2068
2074
|
box-shadow: inset 0 0 0 1px var(--pf-t--global--border--color--default);
|
|
2069
2075
|
}
|
package/dist/css/main.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../../src/AttachMenu/AttachMenu.scss","../../src/Chatbot/Chatbot.scss","../../src/ChatbotAlert/ChatbotAlert.scss","../../src/ChatbotContent/ChatbotContent.scss","../../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss","../../src/ChatbotFooter/ChatbotFootnote.scss","../../src/ChatbotFooter/ChatbotFooter.scss","../../src/ChatbotHeader/ChatbotHeader.scss","../../src/ChatbotModal/ChatbotModal.scss","../../src/ChatbotPopover/ChatbotPopover.scss","../../src/ChatbotToggle/ChatbotToggle.scss","../../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.scss","../../src/CodeModal/CodeModal.scss","../../src/Compare/Compare.scss","../../src/DeepThinking/DeepThinking.scss","../../src/FileDetails/FileDetails.scss","../../src/FileDetailsLabel/FileDetailsLabel.scss","../../src/FileDropZone/FileDropZone.scss","../../src/FilePreview/FilePreview.scss","../../src/ImagePreview/ImagePreview.scss","../../src/Message/Message.scss","../../src/Message/MessageLoading.scss","../../src/Message/CodeBlockMessage/CodeBlockMessage.scss","../../src/Message/TextMessage/TextMessage.scss","../../src/Message/SuperscriptMessage/SuperscriptMessage.scss","../../src/Message/ImageMessage/ImageMessage.scss","../../src/Message/ListMessage/ListMessage.scss","../../src/Message/TableMessage/TableMessage.scss","../../src/Message/QuickStarts/QuickStartTile.scss","../../src/Message/QuickResponse/QuickResponse.scss","../../src/Message/UserFeedback/UserFeedback.scss","../../src/MessageBar/AttachButton.scss","../../src/MessageBar/MicrophoneButton.scss","../../src/MessageBar/SendButton.scss","../../src/MessageBar/StopButton.scss","../../src/MessageBar/MessageBar.scss","../../src/MessageBox/JumpButton.scss","../../src/MessageBox/MessageBox.scss","../../src/MessageDivider/MessageDivider.scss","../../src/ResponseActions/ResponseActions.scss","../../src/Settings/Settings.scss","../../src/SourcesCard/SourcesCard.scss","../../src/SourceDetailsMenuItem/SourceDetailsMenuItem.scss","../../src/TermsOfUse/TermsOfUse.scss","../../src/ToolResponse/ToolResponse.scss","../../src/ToolCall/ToolCall.scss","../../src/main.scss"],"names":[],"mappings":";AAAA;EACE;EACA;;;AAGF;AACE;AAsBA;AASA;;AA9BA;EACE;EACA;EACA;EACA;;AAEF;EACE;;AAGF;AACE;;AACA;EACE;EACA;EACA;EACA;EACA;;AAKJ;EACE;;AAGF;EACE;;AAIF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;;ACxDJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAEF;EACE;EACA;EACA;;AAEF;EACE;EACA;;AAKF;EA9BF;IA+BI;IACA;;;AAIF;EApCF;IAqCI;;;;AAOJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;EAXF;IAYI;;;;AAOJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGA;EACE;;AAIF;EAdF;IAeI;;;;AAIJ;EACE;;;AAGF;AAAA;AAAA;EAGE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAOJ;EACE;;;AC3IF;EACE;EACA;EACA;;;ACAF;EACE;EACA;EACA;EACA;EACA;;AAGA;EARF;IASI;;;AAGF;EACE;;;AAOJ;EAII;AAAA;AAAA;IACE;IACA;;;ACzBJ;EACE;EACA;;AAKF;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAEF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAMJ;EACE;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;AAIF;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAKA;EACE;EACA;EACA;EACA;EACA;;AAKJ;EACE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;AAKA;EACE;;;AASJ;EACE;;;AASF;AAAA;EACE;;AACA;AAAA;EACE;;;AASJ;EACE;;AACA;EACE;EACA;;AAEF;EACE;;;AAUF;AAAA;AAAA;AAAA;EACE;;;AAKN;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAKE;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;;;AC5PN;EACE;;AAEA;EACE;EACA;;;ACHJ;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAMF;EAGI;AAAA;IACE;;EACA;AAAA;IACE;;EAGJ;AAAA;IACE;IACA;IACA;;;AASJ;EACE;;;AAQF;EACE;;;AAIJ;EACE;EACA;;;AC3DF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;;AAQN;EAGI;AAAA;IACE;;EAEF;AAAA;IACE;;;AAUJ;AAAA;EACE;;;AAOJ;AAAA;EAEE;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;;AAOJ;EACE;;;AAOJ;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;;;AAOA;EACE;EACA;;AAGF;EACE;EACA;;;AAIJ;AAAA;EAEE;EACA;;;AAGF;EACE;;;AClKF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAEF;EACE;;;AAOJ;EACE;AAAA;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;;;AAGJ;EACE;AAAA;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;;;AAOJ;EACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAQE;EACE;;;AAQN;EACE;;;AAOA;EACE;;AAGF;EACE;EACA;;;ACjGF;EACE;;AAMA;EACE;;AAEF;EACE;;AAEF;EACE;;AAIF;EACE;EACA;;AAEF;EACE;;;ACxBN;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;;AAGF;EACE;;AAIF;EACE;EACA;;;AAIJ;EACE;EACA;EACA;;;AC3BF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;EACA;;AAEA;EACE;;;AAOJ;EAIM;AAAA;IACE;IACA;;;ACpDN;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;AACA;EACA;EACA;;AAEF;EACE;;AAEF;EACE;EACA;;AAEF;EACE;;AAEF;EACE;EACA;EACA;AAAA;AAAA;EAGA;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;;AAEF;EACE;EACA;EACA;;AAEF;EACE;;AAEF;EACE;EACA;;AAEF;EACE;;AAGA;EACE;;;AAUF;EACE;EACA;;;AAKN;EACE;;;AAGF;EACE;;;AAIA;EACE;;;AC9FJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;;AAEA;EACE;EACA;EACA;;;AAGJ;EACE;EACA;EACA;;AAEA;EALF;IAMI;;;AAGF;EACE;;AAEA;EAHF;IAII;;;;AAKN;EACE;;AAEA;EACE;;AAGF;EACE;;AAIA;EADF;IAEI;;;;AAIN;EACE;;AAEA;EAHF;IAII;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EARF;IASI;IACA;IACA;;;;ACrEJ;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;ACtBF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;EACA;EACA;EACA;EACA;;;ACjCF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EAEA;EACA;EACA;;AACA;EACE;;AAGF;AAAA;EAEE;EACA;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;;AAKF;EACE;;AAGF;EACE;;;AAIJ;AAAA;EAEE;EACA;;AAEA;AAAA;EACE;;;AAKF;EACE;;;AAMF;AAAA;EACE;;;AC/DJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;AAGA;EANF;IAOI;;;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;AACA;EACE;EACA;EACA;EACA;;;AAME;EADF;IAEI;IACA;IACA;;EAEA;IACE;;;;ACnDR;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;ACpBF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEF;EACE;;;AAIJ;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;AAAA;EACE;;AAGJ;EACE;EACA;;AAKA;AAAA;EACE;;AAGJ;EACE;;;ACvDJ;EACE;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAKF;EACE;EACA;;AAKF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAGA;EACE;EAQA;EACA;;AAIF;EACE;EACA;;AAIF;EACE;;AAEF;EACE;;AAMJ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAIF;AAAA;EAEE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;EACA;EACA;EACA;;AAEF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAEF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQE;;AAIJ;EACE;;;AAMJ;EACE;EACA;EACA;;;AAGF;EACE;;;AC9IF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EAEE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;IACE;;EAEF;IAEE;;;;AC9CN;EACE;EACA;EACA;EACA;;AAGA;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAEA;EAEE;;AAMN;EACE;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA;;AAEF;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAKN;EACE;EACA;EACA;;;AAIA;EACE;EACA;;;ACpFJ;EACE;;AAGE;EACE;;;AAMN;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAUJ;EAIE;;;AAIF;EAKE;;;AAIA;EACE;;;AAKF;EACE;EACA;EACA;EACA;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAIJ;EACE;EACA;;;AASF;EACE;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;;AC7HN;EACE;EACA;;AACA;EACE;EACA;;;AJwJF;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AE7KJ;EACE;EACA;EACA;EACA;;AAGA;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAEA;EAEE;;AAMN;EACE;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA;;AAEF;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAKN;EACE;EACA;EACA;;;AAIA;EACE;EACA;;;AGxFJ;EACE;EACA;EACA;EACA;EAGA;;;AFHF;EACE;;AAGE;EACE;;;AAMN;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAUJ;EAIE;;;AAIF;EAKE;;;AAIA;EACE;;;AAKF;EACE;EACA;EACA;EACA;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAIJ;EACE;EACA;;;AASF;EACE;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;;AGzHN;AAAA;EAEE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;;AAKF;AAAA;EAEE;EACA;EACA;;AAGA;AAAA;EACE;;AAMF;EACE;EACA;;AAIJ;EACE;;;ACvCJ;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;ANjBJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EAEE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;IACE;;EAEF;IAEE;;;;AOjDN;EACE;EACA;;AAEA;EAJF;IAKI;IACA;;;AAKA;EACE;;;AAOF;EACE;;;ACnBJ;EACE;;AAEA;EAHF;IAII;;;AAGF;EAPF;IAQI;;;AAKF;EACE;EACA;;AAIJ;AAAA;EAEE;EACA;;AAIF;EACE;EACA;EACA;;;AC7BJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAKA;EACE;;;AAKF;EACE;;AAGF;EACE;;AAIA;EACE;;;ACnEN;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAKA;EACE;;AAIJ;EAEE;;AAEA;EACE;;AAKA;EACE;;;AASR;EACE;EACA;EACA;EACA;;;ACzCF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAMA;EACE;;AAKJ;EACE;EACA;;AAGA;EACE;;AAKA;EACE;;;AAMR;EACE;IACE;;EAEF;IACE;;;AAOJ;EACE;EACA;EACA;EACA;;;ACrDF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EAEE;EACA;;AAEA;EACE;;;AAMJ;EACE;;AACA;EACE;;AAIJ;EACE;EACA;;AAGF;AAAA;EAEE;;;AAIJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAOJ;EACE;EACA;EACA;EACA;;;AC1DF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAEA;EACE;;AAKA;EACE;;;AASR;EACE;EACA;EACA;EACA;;;AClCF;EACE;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;IACE;IACA;;;AAKF;EACE;IACE;IACA;;;;AAQN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;;AC1HJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;EAIF;;AAEA;EACE;;AAGF;EAEE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAIF;EA3CF;IA4CI;;;;AC9CJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAIA;EAVF;IAWI;;;AAGF;EAdF;IAeI;;;;AAIJ;EACE;;;AAGF;EAII;AAAA;AAAA;IACE;IACA;;;AAMJ;EACE;;;ACnCJ;EACE;EACA;;AAEA;AAAA;EAEE;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKF;EACE;EACA;EAEA;;AAGF;EACE;;AAKF;AAAA;EAEE;;;AFrCN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;EAIF;;AAEA;EACE;;AAGF;EAEE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAIF;EA3CF;IA4CI;;;;AGhDJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;;;AAKN;EACE;EACA;;;AC1BF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAIA;EACE;EACA;;;AAIJ;EACE;;;AC3CF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAIA;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;AAAA;EACE;;AAGJ;EACE;EACA;;AAKA;AAAA;EACE;;AAGJ;EACE;;;AAON;EACE;EACA;;;ACpGJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAIF;EACE;EACA;;;AAGA;EACE;;;AAIJ;EACE;;;AAGF;EACE;;;AC9BA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAIF;EACE;IACE;IACA;;;;AAKN;AAAA;EAGE;;AAGE;AAAA;EACE;;AAIJ;AAAA;EACE;;;AAKF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;;ACnFJ;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;;ACjCJ;EACE;EACA;EAEA;EACA;;AAEA;EACE;EACA;EACA;;AAIA;EACE;EACA;EACA;;AAIJ;EACE;;AAGF;EACE;;AAEA;EACE;;AAIJ;EACE;;;ACSJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA","file":"main.css"}
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../src/AttachMenu/AttachMenu.scss","../../src/Chatbot/Chatbot.scss","../../src/ChatbotAlert/ChatbotAlert.scss","../../src/ChatbotContent/ChatbotContent.scss","../../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss","../../src/ChatbotFooter/ChatbotFootnote.scss","../../src/ChatbotFooter/ChatbotFooter.scss","../../src/ChatbotHeader/ChatbotHeader.scss","../../src/ChatbotModal/ChatbotModal.scss","../../src/ChatbotPopover/ChatbotPopover.scss","../../src/ChatbotToggle/ChatbotToggle.scss","../../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.scss","../../src/CodeModal/CodeModal.scss","../../src/Compare/Compare.scss","../../src/DeepThinking/DeepThinking.scss","../../src/FileDetails/FileDetails.scss","../../src/FileDetailsLabel/FileDetailsLabel.scss","../../src/FileDropZone/FileDropZone.scss","../../src/FilePreview/FilePreview.scss","../../src/ImagePreview/ImagePreview.scss","../../src/Message/Message.scss","../../src/Message/MessageLoading.scss","../../src/Message/CodeBlockMessage/CodeBlockMessage.scss","../../src/Message/TextMessage/TextMessage.scss","../../src/Message/SuperscriptMessage/SuperscriptMessage.scss","../../src/Message/ImageMessage/ImageMessage.scss","../../src/Message/ListMessage/ListMessage.scss","../../src/Message/TableMessage/TableMessage.scss","../../src/Message/QuickStarts/QuickStartTile.scss","../../src/Message/QuickResponse/QuickResponse.scss","../../src/Message/UserFeedback/UserFeedback.scss","../../src/MessageBar/AttachButton.scss","../../src/MessageBar/MicrophoneButton.scss","../../src/MessageBar/SendButton.scss","../../src/MessageBar/StopButton.scss","../../src/MessageBar/MessageBar.scss","../../src/MessageBox/JumpButton.scss","../../src/MessageBox/MessageBox.scss","../../src/MessageDivider/MessageDivider.scss","../../src/ResponseActions/ResponseActions.scss","../../src/Settings/Settings.scss","../../src/SourcesCard/SourcesCard.scss","../../src/SourceDetailsMenuItem/SourceDetailsMenuItem.scss","../../src/TermsOfUse/TermsOfUse.scss","../../src/ToolResponse/ToolResponse.scss","../../src/ToolCall/ToolCall.scss","../../src/main.scss"],"names":[],"mappings":";AAAA;EACE;EACA;;;AAGF;AACE;AAsBA;AASA;;AA9BA;EACE;EACA;EACA;EACA;;AAEF;EACE;;AAGF;AACE;;AACA;EACE;EACA;EACA;EACA;EACA;;AAKJ;EACE;;AAGF;EACE;;AAIF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;;ACxDJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAEF;EACE;EACA;EACA;;AAEF;EACE;EACA;;AAKF;EA9BF;IA+BI;IACA;;;AAIF;EApCF;IAqCI;;;;AAOJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;EAXF;IAYI;;;;AAOJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGA;EACE;;AAIF;EAdF;IAeI;;;;AAIJ;EACE;;;AAGF;AAAA;AAAA;EAGE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAOJ;EACE;;;AC3IF;EACE;EACA;EACA;;;ACAF;EACE;EACA;EACA;EACA;EACA;;AAGA;EARF;IASI;;;AAGF;EACE;;;AAOJ;EAII;AAAA;AAAA;IACE;IACA;;;ACzBJ;EACE;EACA;;AAKF;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAEF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAMJ;EACE;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;AAIF;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAKA;EACE;EACA;EACA;EACA;EACA;;AAKJ;EACE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;AAKA;EACE;;;AASJ;EACE;;;AASF;AAAA;EACE;;AACA;AAAA;EACE;;;AASJ;EACE;;AACA;EACE;EACA;;AAEF;EACE;;;AAUF;AAAA;AAAA;AAAA;EACE;;;AAKN;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAKE;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;;;AC5PN;EACE;;AAEA;EACE;EACA;;;ACHJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAGJ;EACE;EACA;EACA;EACA;EACA;;;AAMF;EAGI;AAAA;IACE;;EACA;AAAA;IACE;;EAGJ;AAAA;IACE;IACA;IACA;;;AASJ;EACE;;;AAQF;EACE;;;AAIJ;EACE;EACA;;;AC/DF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;;AAQN;EAGI;AAAA;IACE;;EAEF;AAAA;IACE;;;AAUJ;AAAA;EACE;;;AAOJ;AAAA;EAEE;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;;AAOJ;EACE;;;AAOJ;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;;;AAOA;EACE;EACA;;AAGF;EACE;EACA;;;AAIJ;AAAA;EAEE;EACA;;;AAGF;EACE;;;AClKF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAEF;EACE;;;AAOJ;EACE;AAAA;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;;;AAGJ;EACE;AAAA;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;;;AAOJ;EACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAQE;EACE;;;AAQN;EACE;;;AAOA;EACE;;AAGF;EACE;EACA;;;ACjGF;EACE;;AAMA;EACE;;AAEF;EACE;;AAEF;EACE;;AAIF;EACE;EACA;;AAEF;EACE;;;ACxBN;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;;AAGF;EACE;;AAIF;EACE;EACA;;;AAIJ;EACE;EACA;EACA;;;AC3BF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;EACA;;AAEA;EACE;;;AAOJ;EAIM;AAAA;IACE;IACA;;;ACpDN;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;AACA;EACA;EACA;;AAEF;EACE;;AAEF;EACE;EACA;;AAEF;EACE;;AAEF;EACE;EACA;EACA;AAAA;AAAA;EAGA;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;;AAEF;EACE;EACA;EACA;;AAEF;EACE;;AAEF;EACE;EACA;;AAEF;EACE;;AAGA;EACE;;;AAUF;EACE;EACA;;;AAKN;EACE;;;AAGF;EACE;;;AAIA;EACE;;;AC9FJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;;AAEA;EACE;EACA;EACA;;;AAGJ;EACE;EACA;EACA;;AAEA;EALF;IAMI;;;AAGF;EACE;;AAEA;EAHF;IAII;;;;AAKN;EACE;;AAEA;EACE;;AAGF;EACE;;AAIA;EADF;IAEI;;;;AAIN;EACE;;AAEA;EAHF;IAII;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EARF;IASI;IACA;IACA;;;;ACrEJ;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;ACtBF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;EACA;EACA;EACA;EACA;;;ACjCF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EAEA;EACA;EACA;;AACA;EACE;;AAGF;AAAA;EAEE;EACA;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;;AAKF;EACE;;AAGF;EACE;;;AAIJ;AAAA;EAEE;EACA;;AAEA;AAAA;EACE;;;AAKF;EACE;;;AAMF;AAAA;EACE;;;AC/DJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;AAGA;EANF;IAOI;;;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;AACA;EACE;EACA;EACA;EACA;;;AAME;EADF;IAEI;IACA;IACA;;EAEA;IACE;;;;ACnDR;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;ACpBF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEF;EACE;;;AAIJ;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;AAAA;EACE;;AAGJ;EACE;EACA;;AAKA;AAAA;EACE;;AAGJ;EACE;;;ACvDJ;EACE;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAKF;EACE;EACA;;AAKF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAGA;EACE;EAQA;EACA;;AAIF;EACE;EACA;;AAIF;EACE;;AAEF;EACE;;AAMJ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAIF;AAAA;EAEE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;EACA;EACA;EACA;;AAEF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAEF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQE;;AAIJ;EACE;;;AAMJ;EACE;EACA;EACA;;;AAGF;EACE;;;AC9IF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EAEE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;IACE;;EAEF;IAEE;;;;AC9CN;EACE;EACA;EACA;EACA;;AAGA;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAEA;EAEE;;AAMN;EACE;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA;;AAEF;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAKN;EACE;EACA;EACA;;;AAIA;EACE;EACA;;;ACpFJ;EACE;;AAGE;EACE;;;AAMN;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAUJ;EAIE;;;AAIF;EAKE;;;AAIA;EACE;;;AAKF;EACE;EACA;EACA;EACA;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAIJ;EACE;EACA;;;AASF;EACE;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;;AC7HN;EACE;EACA;;AACA;EACE;EACA;;;AJwJF;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AE7KJ;EACE;EACA;EACA;EACA;;AAGA;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAEA;EAEE;;AAMN;EACE;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA;;AAEF;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAKN;EACE;EACA;EACA;;;AAIA;EACE;EACA;;;AGxFJ;EACE;EACA;EACA;EACA;EAGA;;;AFHF;EACE;;AAGE;EACE;;;AAMN;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAUJ;EAIE;;;AAIF;EAKE;;;AAIA;EACE;;;AAKF;EACE;EACA;EACA;EACA;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAIJ;EACE;EACA;;;AASF;EACE;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;;AGzHN;AAAA;EAEE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;;AAKF;AAAA;EAEE;EACA;EACA;;AAGA;AAAA;EACE;;AAMF;EACE;EACA;;AAIJ;EACE;;;ACvCJ;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;ANjBJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EAEE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;IACE;;EAEF;IAEE;;;;AOjDN;EACE;EACA;;AAEA;EAJF;IAKI;IACA;;;AAKA;EACE;;;AAOF;EACE;;;ACnBJ;EACE;;AAEA;EAHF;IAII;;;AAGF;EAPF;IAQI;;;AAKF;EACE;EACA;;AAIJ;AAAA;EAEE;EACA;;AAIF;EACE;EACA;EACA;;;AC7BJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAKA;EACE;;;AAKF;EACE;;AAGF;EACE;;AAIA;EACE;;;ACnEN;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAKA;EACE;;AAIJ;EAEE;;AAEA;EACE;;AAKA;EACE;;;AASR;EACE;EACA;EACA;EACA;;;ACzCF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAMA;EACE;;AAKJ;EACE;EACA;;AAGA;EACE;;AAKA;EACE;;;AAMR;EACE;IACE;;EAEF;IACE;;;AAOJ;EACE;EACA;EACA;EACA;;;ACrDF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EAEE;EACA;;AAEA;EACE;;;AAMJ;EACE;;AACA;EACE;;AAIJ;EACE;EACA;;AAGF;AAAA;EAEE;;;AAIJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAOJ;EACE;EACA;EACA;EACA;;;AC1DF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAEA;EACE;;AAKA;EACE;;;AASR;EACE;EACA;EACA;EACA;;;AClCF;EACE;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;IACE;IACA;;;AAKF;EACE;IACE;IACA;;;;AAQN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;;AC9HJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;EAIF;;AAEA;EACE;;AAGF;EAEE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAIF;EA3CF;IA4CI;;;;AC9CJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAIA;EAVF;IAWI;;;AAGF;EAdF;IAeI;;;;AAIJ;EACE;;;AAGF;EAII;AAAA;AAAA;IACE;IACA;;;AAMJ;EACE;;;ACnCJ;EACE;EACA;;AAEA;AAAA;EAEE;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKF;EACE;EACA;EAEA;;AAGF;EACE;;AAKF;AAAA;EAEE;;;AFrCN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;EAIF;;AAEA;EACE;;AAGF;EAEE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAIF;EA3CF;IA4CI;;;;AGhDJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;;;AAKN;EACE;EACA;;;AC1BF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAIA;EACE;EACA;;;AAIJ;EACE;;;AC3CF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAIA;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;AAAA;EACE;;AAGJ;EACE;EACA;;AAKA;AAAA;EACE;;AAGJ;EACE;;;AAON;EACE;EACA;;;ACpGJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAIF;EACE;EACA;;;AAGA;EACE;;;AAIJ;EACE;;;AAGF;EACE;;;AC9BA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAIF;EACE;IACE;IACA;;;;AAKN;AAAA;EAGE;;AAGE;AAAA;EACE;;AAIJ;AAAA;EACE;;;AAKF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;;ACnFJ;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;;ACjCJ;EACE;EACA;EAEA;EACA;;AAEA;EACE;EACA;EACA;;AAIA;EACE;EACA;EACA;;AAIJ;EACE;;AAGF;EACE;;AAEA;EACE;;AAIJ;EACE;;;ACSJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA","file":"main.css"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FunctionComponent } from 'react';
|
|
2
|
-
import { DropdownProps, DropdownToggleProps, PopperOptions } from '@patternfly/react-core';
|
|
2
|
+
import { DropdownProps, DropdownToggleProps, PopperOptions, MenuSearchInputProps, SearchInputProps, MenuSearchProps } from '@patternfly/react-core';
|
|
3
3
|
export interface AttachMenuProps extends DropdownProps {
|
|
4
4
|
/** Items in menu */
|
|
5
5
|
filteredItems: React.ReactNode;
|
|
@@ -21,6 +21,12 @@ export interface AttachMenuProps extends DropdownProps {
|
|
|
21
21
|
searchInputAriaLabel?: string;
|
|
22
22
|
/** Toggle to be rendered */
|
|
23
23
|
toggle: DropdownToggleProps | ((toggleRef: React.RefObject<any>) => React.ReactNode);
|
|
24
|
+
/** Additional props passed to MenuSearch component */
|
|
25
|
+
menuSearchProps?: Omit<MenuSearchProps, 'ref'>;
|
|
26
|
+
/** Additional props passed to MenuSearchInput component */
|
|
27
|
+
menuSearchInputProps?: Omit<MenuSearchInputProps, 'ref'>;
|
|
28
|
+
/** Additional props passed to SearchInput component */
|
|
29
|
+
searchInputProps?: SearchInputProps;
|
|
24
30
|
}
|
|
25
31
|
export declare const AttachMenu: FunctionComponent<AttachMenuProps>;
|
|
26
32
|
export default AttachMenu;
|
|
@@ -13,7 +13,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
13
13
|
// Import PatternFly components
|
|
14
14
|
import { MenuSearch, MenuSearchInput, SearchInput, Dropdown } from '@patternfly/react-core';
|
|
15
15
|
export const AttachMenu = (_a) => {
|
|
16
|
-
var { className, filteredItems, handleTextInputChange, isOpen, popperProps = undefined, onOpenChange, onOpenChangeKeys, onSelect, searchInputPlaceholder, searchInputAriaLabel = 'Filter menu items', toggle } = _a, props = __rest(_a, ["className", "filteredItems", "handleTextInputChange", "isOpen", "popperProps", "onOpenChange", "onOpenChangeKeys", "onSelect", "searchInputPlaceholder", "searchInputAriaLabel", "toggle"]);
|
|
17
|
-
return (_jsxs(Dropdown, Object.assign({ className: `pf-chatbot__menu ${className !== null && className !== void 0 ? className : ''}`, isOpen: isOpen, onOpenChange: (isOpen) => onOpenChange(isOpen), onOpenChangeKeys: onOpenChangeKeys !== null && onOpenChangeKeys !== void 0 ? onOpenChangeKeys : ['Esc'], toggle: toggle, popperProps: popperProps, onSelect: onSelect }, props, { children: [_jsx(MenuSearch, { children: _jsx(MenuSearchInput, { children: _jsx(SearchInput, { "aria-label": searchInputAriaLabel, onChange: (_event, value) => handleTextInputChange(value), placeholder: searchInputPlaceholder }) }) }), filteredItems] })));
|
|
16
|
+
var { className, filteredItems, handleTextInputChange, isOpen, popperProps = undefined, onOpenChange, onOpenChangeKeys, onSelect, searchInputPlaceholder, searchInputAriaLabel = 'Filter menu items', toggle, menuSearchProps, menuSearchInputProps, searchInputProps } = _a, props = __rest(_a, ["className", "filteredItems", "handleTextInputChange", "isOpen", "popperProps", "onOpenChange", "onOpenChangeKeys", "onSelect", "searchInputPlaceholder", "searchInputAriaLabel", "toggle", "menuSearchProps", "menuSearchInputProps", "searchInputProps"]);
|
|
17
|
+
return (_jsxs(Dropdown, Object.assign({ className: `pf-chatbot__menu ${className !== null && className !== void 0 ? className : ''}`, isOpen: isOpen, onOpenChange: (isOpen) => onOpenChange(isOpen), onOpenChangeKeys: onOpenChangeKeys !== null && onOpenChangeKeys !== void 0 ? onOpenChangeKeys : ['Esc'], toggle: toggle, popperProps: popperProps, onSelect: onSelect }, props, { children: [_jsx(MenuSearch, Object.assign({}, menuSearchProps, { children: _jsx(MenuSearchInput, Object.assign({}, menuSearchInputProps, { children: _jsx(SearchInput, Object.assign({ "aria-label": searchInputAriaLabel, onChange: (_event, value) => handleTextInputChange(value), placeholder: searchInputPlaceholder }, searchInputProps)) })) })), filteredItems] })));
|
|
18
18
|
};
|
|
19
19
|
export default AttachMenu;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { HTMLProps, FunctionComponent } from 'react';
|
|
2
2
|
export interface ChatbotFooterProps extends HTMLProps<HTMLDivElement> {
|
|
3
|
-
/** Children for the
|
|
3
|
+
/** Children for the footer - supports MessageBar and FootNote components*/
|
|
4
4
|
children?: React.ReactNode;
|
|
5
|
-
/** Custom classname for the
|
|
5
|
+
/** Custom classname for the footer component */
|
|
6
6
|
className?: string;
|
|
7
|
+
/** Sets footer to compact styling. */
|
|
7
8
|
isCompact?: boolean;
|
|
9
|
+
/** Sets background color to primary */
|
|
10
|
+
isPrimary?: boolean;
|
|
8
11
|
}
|
|
9
12
|
export declare const ChatbotFooter: FunctionComponent<ChatbotFooterProps>;
|
|
10
13
|
export default ChatbotFooter;
|
|
@@ -12,7 +12,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
12
12
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
13
|
import { Divider } from '@patternfly/react-core';
|
|
14
14
|
export const ChatbotFooter = (_a) => {
|
|
15
|
-
var { children, className, isCompact } = _a, props = __rest(_a, ["children", "className", "isCompact"]);
|
|
16
|
-
return (_jsxs("div", Object.assign({ className: `pf-chatbot__footer ${isCompact ? 'pf-m-compact' : ''} ${className !== null && className !== void 0 ? className : ''}` }, props, { children: [_jsx(Divider, {}), _jsx("div", { className: "pf-chatbot__footer-container", children: children })] })));
|
|
15
|
+
var { children, className, isCompact, isPrimary } = _a, props = __rest(_a, ["children", "className", "isCompact", "isPrimary"]);
|
|
16
|
+
return (_jsxs("div", Object.assign({ className: `pf-chatbot__footer ${isCompact ? 'pf-m-compact' : ''} ${isPrimary ? 'pf-m-primary' : ''} ${className !== null && className !== void 0 ? className : ''}` }, props, { children: [_jsx(Divider, {}), _jsx("div", { className: "pf-chatbot__footer-container", children: children })] })));
|
|
17
17
|
};
|
|
18
18
|
export default ChatbotFooter;
|
|
@@ -12,7 +12,11 @@ describe('ChatbotFooter', () => {
|
|
|
12
12
|
expect(container.querySelector('.custom-class')).toBeTruthy();
|
|
13
13
|
});
|
|
14
14
|
it('should handle isCompact', () => {
|
|
15
|
-
render(_jsx(ChatbotFooter, {
|
|
15
|
+
render(_jsx(ChatbotFooter, { isCompact: true, "data-testid": "footer", children: "Chatbot Content" }));
|
|
16
16
|
expect(screen.getByTestId('footer')).toHaveClass('pf-m-compact');
|
|
17
17
|
});
|
|
18
|
+
it('should handle isPrimary', () => {
|
|
19
|
+
render(_jsx(ChatbotFooter, { isPrimary: true, "data-testid": "footer", children: "Chatbot Content" }));
|
|
20
|
+
expect(screen.getByTestId('footer')).toHaveClass('pf-m-primary');
|
|
21
|
+
});
|
|
18
22
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { FunctionComponent } from 'react';
|
|
2
2
|
import { Accept, DropEvent, DropzoneOptions, FileError, FileRejection } from 'react-dropzone';
|
|
3
|
-
import { ButtonProps, TextAreaProps, TooltipProps } from '@patternfly/react-core';
|
|
3
|
+
import { ButtonProps, MenuSearchInputProps, MenuSearchProps, SearchInputProps, TextAreaProps, TooltipProps } from '@patternfly/react-core';
|
|
4
4
|
import { ChatbotDisplayMode } from '../Chatbot';
|
|
5
5
|
export interface MessageBarWithAttachMenuProps {
|
|
6
6
|
/** Flag to enable whether attach menu is open */
|
|
@@ -21,6 +21,12 @@ export interface MessageBarWithAttachMenuProps {
|
|
|
21
21
|
onAttachMenuOnOpenChangeKeys?: string[];
|
|
22
22
|
/** Callback to change the open state of the menu. Triggered by clicking outside of the menu. */
|
|
23
23
|
onAttachMenuOpenChange?: (isOpen: boolean) => void;
|
|
24
|
+
/** Additional props passed to MenuSearch component in attach menu */
|
|
25
|
+
menuSearchProps?: Omit<MenuSearchProps, 'ref'>;
|
|
26
|
+
/** Additional props passed to MenuSearchInput component in attach menu */
|
|
27
|
+
menuSearchInputProps?: Omit<MenuSearchInputProps, 'ref'>;
|
|
28
|
+
/** Additional props passed to SearchInput component in attach menu */
|
|
29
|
+
searchInputProps?: SearchInputProps;
|
|
24
30
|
}
|
|
25
31
|
export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
|
|
26
32
|
/** Callback to get the value of input message by user */
|
|
@@ -105,6 +111,8 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
|
|
|
105
111
|
isCompact?: boolean;
|
|
106
112
|
/** Ref applied to message bar textarea, for use with focus or other custom behaviors */
|
|
107
113
|
innerRef?: React.Ref<HTMLTextAreaElement>;
|
|
114
|
+
/** Sets background color to primary */
|
|
115
|
+
isPrimary?: boolean;
|
|
108
116
|
}
|
|
109
117
|
export declare const MessageBarBase: FunctionComponent<MessageBarProps>;
|
|
110
118
|
declare const MessageBar: import("react").ForwardRefExoticComponent<MessageBarProps & import("react").RefAttributes<HTMLTextAreaElement>>;
|
|
@@ -20,7 +20,7 @@ import AttachMenu from '../AttachMenu';
|
|
|
20
20
|
import StopButton from './StopButton';
|
|
21
21
|
export const MessageBarBase = (_a) => {
|
|
22
22
|
var _b;
|
|
23
|
-
var { onSendMessage, className, alwayShowSendButton, placeholder = 'Send a message...', hasAttachButton = true, hasMicrophoneButton, listeningText = 'Listening', handleAttach, attachMenuProps, isSendButtonDisabled, handleStopButton, hasStopButton, buttonProps, onChange, displayMode, value, isCompact = false, allowedFileTypes, minSize, maxSize, maxFiles, isAttachmentDisabled, onAttach, onAttachRejected, validator, dropzoneProps, innerRef } = _a, props = __rest(_a, ["onSendMessage", "className", "alwayShowSendButton", "placeholder", "hasAttachButton", "hasMicrophoneButton", "listeningText", "handleAttach", "attachMenuProps", "isSendButtonDisabled", "handleStopButton", "hasStopButton", "buttonProps", "onChange", "displayMode", "value", "isCompact", "allowedFileTypes", "minSize", "maxSize", "maxFiles", "isAttachmentDisabled", "onAttach", "onAttachRejected", "validator", "dropzoneProps", "innerRef"]);
|
|
23
|
+
var { onSendMessage, className, alwayShowSendButton, placeholder = 'Send a message...', hasAttachButton = true, hasMicrophoneButton, listeningText = 'Listening', handleAttach, attachMenuProps, isSendButtonDisabled, handleStopButton, hasStopButton, buttonProps, onChange, displayMode, value, isCompact = false, allowedFileTypes, minSize, maxSize, maxFiles, isAttachmentDisabled, onAttach, onAttachRejected, validator, dropzoneProps, innerRef, isPrimary } = _a, props = __rest(_a, ["onSendMessage", "className", "alwayShowSendButton", "placeholder", "hasAttachButton", "hasMicrophoneButton", "listeningText", "handleAttach", "attachMenuProps", "isSendButtonDisabled", "handleStopButton", "hasStopButton", "buttonProps", "onChange", "displayMode", "value", "isCompact", "allowedFileTypes", "minSize", "maxSize", "maxFiles", "isAttachmentDisabled", "onAttach", "onAttachRejected", "validator", "dropzoneProps", "innerRef", "isPrimary"]);
|
|
24
24
|
// Text Input
|
|
25
25
|
// --------------------------------------------------------------------------
|
|
26
26
|
const [message, setMessage] = useState(value !== null && value !== void 0 ? value : '');
|
|
@@ -200,9 +200,9 @@ export const MessageBarBase = (_a) => {
|
|
|
200
200
|
(_a = attachButtonRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
201
201
|
attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.setIsAttachMenuOpen(isAttachMenuOpen);
|
|
202
202
|
(attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuOpenChange) && (attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuOpenChange(isAttachMenuOpen));
|
|
203
|
-
}, onOpenChangeKeys: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuOnOpenChangeKeys, onSelect: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuSelect }, (attachMenuProps && { handleTextInputChange: attachMenuProps.onAttachMenuInputChange }), { popperProps: { direction: 'up', distance: 8 }, searchInputPlaceholder: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.attachMenuInputPlaceholder })));
|
|
203
|
+
}, onOpenChangeKeys: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuOnOpenChangeKeys, onSelect: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.onAttachMenuSelect }, (attachMenuProps && { handleTextInputChange: attachMenuProps.onAttachMenuInputChange }), { popperProps: { direction: 'up', distance: 8 }, searchInputPlaceholder: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.attachMenuInputPlaceholder }, attachMenuProps)));
|
|
204
204
|
}
|
|
205
|
-
return _jsx("div", { className: `pf-chatbot__message-bar ${className !== null && className !== void 0 ? className : ''}`, children: messageBarContents });
|
|
205
|
+
return (_jsx("div", { className: `pf-chatbot__message-bar ${isPrimary ? 'pf-m-primary' : ''} ${className !== null && className !== void 0 ? className : ''}`, children: messageBarContents }));
|
|
206
206
|
};
|
|
207
207
|
const MessageBar = forwardRef((props, ref) => (_jsx(MessageBarBase, Object.assign({ innerRef: ref }, props))));
|
|
208
208
|
export { MessageBar };
|
|
@@ -154,6 +154,39 @@ describe('Message bar', () => {
|
|
|
154
154
|
yield userEvent.click(attachButton);
|
|
155
155
|
expect(attachToggleClickSpy).toHaveBeenCalledTimes(1);
|
|
156
156
|
}));
|
|
157
|
+
it('can pass searchInputProps to search input in AttachMenu', () => {
|
|
158
|
+
render(_jsx(MessageBar, { onSendMessage: jest.fn, value: "test", attachMenuProps: {
|
|
159
|
+
isAttachMenuOpen: true,
|
|
160
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
161
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
162
|
+
onAttachMenuInputChange: jest.fn(),
|
|
163
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
164
|
+
searchInputProps: { isDisabled: true }
|
|
165
|
+
} }));
|
|
166
|
+
expect(screen.getByRole('textbox', { name: /Filter menu items/i })).toBeDisabled();
|
|
167
|
+
});
|
|
168
|
+
it('can pass menuSearchProps to search input in AttachMenu', () => {
|
|
169
|
+
render(_jsx(MessageBar, { onSendMessage: jest.fn, value: "test", attachMenuProps: {
|
|
170
|
+
isAttachMenuOpen: true,
|
|
171
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
172
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
173
|
+
onAttachMenuInputChange: jest.fn(),
|
|
174
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
175
|
+
menuSearchProps: { 'data-testid': 'menu-search' }
|
|
176
|
+
} }));
|
|
177
|
+
expect(screen.getByTestId('menu-search')).toBeTruthy();
|
|
178
|
+
});
|
|
179
|
+
it('can pass menuSearchInputProps to search input in AttachMenu', () => {
|
|
180
|
+
render(_jsx(MessageBar, { onSendMessage: jest.fn, value: "test", attachMenuProps: {
|
|
181
|
+
isAttachMenuOpen: true,
|
|
182
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
183
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
184
|
+
onAttachMenuInputChange: jest.fn(),
|
|
185
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
186
|
+
menuSearchInputProps: { 'data-testid': 'menu-search-input' }
|
|
187
|
+
} }));
|
|
188
|
+
expect(screen.getByTestId('menu-search-input')).toBeTruthy();
|
|
189
|
+
});
|
|
157
190
|
it('can hide attach button', () => {
|
|
158
191
|
render(_jsx(MessageBar, { onSendMessage: jest.fn, hasAttachButton: false }));
|
|
159
192
|
expect(screen.queryByRole('button', { name: 'Attach' })).toBeFalsy();
|
|
@@ -264,4 +297,8 @@ describe('Message bar', () => {
|
|
|
264
297
|
(_a = ref.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
265
298
|
expect(document.activeElement).toBe(screen.getByRole('textbox'));
|
|
266
299
|
});
|
|
300
|
+
it('should handle isPrimary', () => {
|
|
301
|
+
const { container } = render(_jsx(MessageBar, { isPrimary: true, onSendMessage: jest.fn }));
|
|
302
|
+
expect(container.querySelector('.pf-m-primary')).toBeTruthy();
|
|
303
|
+
});
|
|
267
304
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/chatbot",
|
|
3
|
-
"version": "6.5.0-prerelease.
|
|
3
|
+
"version": "6.5.0-prerelease.4",
|
|
4
4
|
"description": "This library provides React components based on PatternFly 6 that can be used to build chatbots.",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -131,15 +131,23 @@ This demo displays a ChatBot in a static, inline drawer. This demo includes:
|
|
|
131
131
|
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
+
### Primary color background
|
|
135
|
+
|
|
136
|
+
This demo displays an embedded ChatBot with a [primary background color](/design-foundations/colors#background-colors). This example includes the same features as the [Embedded ChatBot demo](/patternfly-ai/chatbot/overview/demo/#embedded-chatbot)—the only differences are that the background color is adjusted via the `isPrimary` prop and some of the sample Messages have changed. You can use the same logic to adjust the background color in any ChatBot layout.
|
|
137
|
+
|
|
138
|
+
```js file="./WhiteEmbeddedChatbot.tsx" isFullscreen
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
|
|
134
142
|
### Display mode switcher
|
|
135
143
|
|
|
136
144
|
This demo showcases how the ChatBot can be rendered in different display modes to suit various application layouts. It demonstrates how to dynamically change the page structure in response to the user's selection. This demo includes:
|
|
137
145
|
|
|
138
146
|
1. The ability to switch between overlay, drawer, and fullscreen modes using the [`<ChatbotHeaderOptionsDropdown>`](/patternfly-ai/chatbot/ui#header-options) in the header.
|
|
139
147
|
2. A conditional page layout that renders the ChatBot for each display mode option:
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
148
|
+
- **Overlay:** As a floating window on top of the page content.
|
|
149
|
+
- **Drawer:** Inside an inline PatternFly `<Drawer>` as a side panel.
|
|
150
|
+
- **Fullscreen:** As a top-level component that covers the entire screen for an embedded experience.
|
|
143
151
|
3. Logic to show or hide the `<ChatbotToggle>` button, which is only present in the default overlay mode.
|
|
144
152
|
4. A [basic ChatBot](#basic-chatbot) with a header, welcome prompt, and message bar to populate the different layouts.
|
|
145
153
|
|
|
@@ -170,7 +178,7 @@ Your code structure should look like this:
|
|
|
170
178
|
|
|
171
179
|
### Chat transcripts
|
|
172
180
|
|
|
173
|
-
This demo illustrates how you could add downloadable transcripts to your ChatBot, which outline conversation details in a Markdown file. This approach allows users to easily share information from a conversation with others.
|
|
181
|
+
This demo illustrates how you could add downloadable transcripts to your ChatBot, which outline conversation details in a Markdown file. This approach allows users to easily share information from a conversation with others.
|
|
174
182
|
|
|
175
183
|
A message transcript includes details from a single chat message. To download a sample message transcript in this demo, click the "Download" action under a bot message.
|
|
176
184
|
|
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
import { useEffect, useRef, useState, FunctionComponent, MouseEvent } from 'react';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Bullseye,
|
|
5
|
+
Brand,
|
|
6
|
+
DropdownList,
|
|
7
|
+
DropdownItem,
|
|
8
|
+
Page,
|
|
9
|
+
Masthead,
|
|
10
|
+
MastheadMain,
|
|
11
|
+
MastheadBrand,
|
|
12
|
+
MastheadLogo,
|
|
13
|
+
PageSidebarBody,
|
|
14
|
+
PageSidebar,
|
|
15
|
+
MastheadToggle,
|
|
16
|
+
PageToggleButton,
|
|
17
|
+
SkipToContent
|
|
18
|
+
} from '@patternfly/react-core';
|
|
19
|
+
|
|
20
|
+
import Chatbot, { ChatbotDisplayMode } from '@patternfly/chatbot/dist/dynamic/Chatbot';
|
|
21
|
+
import ChatbotContent from '@patternfly/chatbot/dist/dynamic/ChatbotContent';
|
|
22
|
+
import ChatbotWelcomePrompt from '@patternfly/chatbot/dist/dynamic/ChatbotWelcomePrompt';
|
|
23
|
+
import ChatbotFooter, { ChatbotFootnote } from '@patternfly/chatbot/dist/dynamic/ChatbotFooter';
|
|
24
|
+
import MessageBar from '@patternfly/chatbot/dist/dynamic/MessageBar';
|
|
25
|
+
import MessageBox from '@patternfly/chatbot/dist/dynamic/MessageBox';
|
|
26
|
+
import Message, { MessageProps } from '@patternfly/chatbot/dist/dynamic/Message';
|
|
27
|
+
import ChatbotConversationHistoryNav, {
|
|
28
|
+
Conversation
|
|
29
|
+
} from '@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav';
|
|
30
|
+
import ChatbotHeader, {
|
|
31
|
+
ChatbotHeaderMenu,
|
|
32
|
+
ChatbotHeaderMain,
|
|
33
|
+
ChatbotHeaderTitle,
|
|
34
|
+
ChatbotHeaderActions,
|
|
35
|
+
ChatbotHeaderSelectorDropdown
|
|
36
|
+
} from '@patternfly/chatbot/dist/dynamic/ChatbotHeader';
|
|
37
|
+
|
|
38
|
+
import PFHorizontalLogoColor from '../UI/PF-HorizontalLogo-Color.svg';
|
|
39
|
+
import PFHorizontalLogoReverse from '../UI/PF-HorizontalLogo-Reverse.svg';
|
|
40
|
+
import { BarsIcon } from '@patternfly/react-icons';
|
|
41
|
+
import userAvatar from '../Messages/user_avatar.svg';
|
|
42
|
+
import patternflyAvatar from '../Messages/patternfly_avatar.jpg';
|
|
43
|
+
import '@patternfly/react-core/dist/styles/base.css';
|
|
44
|
+
import '@patternfly/chatbot/dist/css/main.css';
|
|
45
|
+
|
|
46
|
+
const footnoteProps = {
|
|
47
|
+
label: 'ChatBot uses AI. Check for mistakes.',
|
|
48
|
+
popover: {
|
|
49
|
+
title: 'Verify information',
|
|
50
|
+
description: `While ChatBot strives for accuracy, AI is experimental and can make mistakes. We cannot guarantee that all information provided by ChatBot is up to date or without error. You should always verify responses using reliable sources, especially for crucial information and decision making.`,
|
|
51
|
+
bannerImage: {
|
|
52
|
+
src: 'https://cdn.dribbble.com/userupload/10651749/file/original-8a07b8e39d9e8bf002358c66fce1223e.gif',
|
|
53
|
+
alt: 'Example image for footnote popover'
|
|
54
|
+
},
|
|
55
|
+
cta: {
|
|
56
|
+
label: 'Dismiss',
|
|
57
|
+
onClick: () => {
|
|
58
|
+
alert('Do something!');
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
link: {
|
|
62
|
+
label: 'View AI policy',
|
|
63
|
+
url: 'https://www.redhat.com/'
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const markdown = `A paragraph with *emphasis* and **strong importance**.
|
|
69
|
+
|
|
70
|
+
> A block quote with ~strikethrough~ and a URL: https://reactjs.org.
|
|
71
|
+
|
|
72
|
+
Here is an inline code - \`() => void\`
|
|
73
|
+
|
|
74
|
+
Here is some YAML code:
|
|
75
|
+
|
|
76
|
+
~~~yaml
|
|
77
|
+
apiVersion: helm.openshift.io/v1beta1/
|
|
78
|
+
kind: HelmChartRepository
|
|
79
|
+
metadata:
|
|
80
|
+
name: azure-sample-repo0oooo00ooo
|
|
81
|
+
spec:
|
|
82
|
+
connectionConfig:
|
|
83
|
+
url: https://raw.githubusercontent.com/Azure-Samples/helm-charts/master/docs
|
|
84
|
+
~~~
|
|
85
|
+
|
|
86
|
+
Here is some JavaScript code:
|
|
87
|
+
|
|
88
|
+
~~~js
|
|
89
|
+
const MessageLoading = () => (
|
|
90
|
+
<div className="pf-chatbot__message-loading">
|
|
91
|
+
<span className="pf-chatbot__message-loading-dots">
|
|
92
|
+
<span className="pf-v6-screen-reader">Loading message</span>
|
|
93
|
+
</span>
|
|
94
|
+
</div>
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
export default MessageLoading;
|
|
98
|
+
|
|
99
|
+
~~~
|
|
100
|
+
`;
|
|
101
|
+
|
|
102
|
+
// It's important to set a date and timestamp prop since the Message components re-render.
|
|
103
|
+
// The timestamps re-render with them.
|
|
104
|
+
const date = new Date();
|
|
105
|
+
|
|
106
|
+
const initialMessages: MessageProps[] = [
|
|
107
|
+
{
|
|
108
|
+
id: '1',
|
|
109
|
+
role: 'user',
|
|
110
|
+
content: 'Hello, can you give me an example of what you can do?',
|
|
111
|
+
name: 'User',
|
|
112
|
+
avatar: userAvatar,
|
|
113
|
+
timestamp: date.toLocaleString(),
|
|
114
|
+
avatarProps: { isBordered: true }
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
id: '2',
|
|
118
|
+
role: 'bot',
|
|
119
|
+
content: markdown,
|
|
120
|
+
name: 'Bot',
|
|
121
|
+
avatar: patternflyAvatar,
|
|
122
|
+
timestamp: date.toLocaleString(),
|
|
123
|
+
actions: {
|
|
124
|
+
// eslint-disable-next-line no-console
|
|
125
|
+
positive: { onClick: () => console.log('Good response') },
|
|
126
|
+
// eslint-disable-next-line no-console
|
|
127
|
+
negative: { onClick: () => console.log('Bad response') },
|
|
128
|
+
// eslint-disable-next-line no-console
|
|
129
|
+
copy: { onClick: () => console.log('Copy') },
|
|
130
|
+
// eslint-disable-next-line no-console
|
|
131
|
+
download: { onClick: () => console.log('Download') },
|
|
132
|
+
// eslint-disable-next-line no-console
|
|
133
|
+
listen: { onClick: () => console.log('Listen') }
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
];
|
|
137
|
+
|
|
138
|
+
const welcomePrompts = [
|
|
139
|
+
{
|
|
140
|
+
title: 'Set up account',
|
|
141
|
+
message: 'Choose the necessary settings and preferences for your account.'
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
title: 'Troubleshoot issue',
|
|
145
|
+
message: 'Find documentation and instructions to resolve your issue.'
|
|
146
|
+
}
|
|
147
|
+
];
|
|
148
|
+
|
|
149
|
+
const initialConversations = {
|
|
150
|
+
Today: [{ id: '1', text: 'Hello, can you give me an example of what you can do?' }],
|
|
151
|
+
'This month': [
|
|
152
|
+
{
|
|
153
|
+
id: '2',
|
|
154
|
+
text: 'Enterprise Linux installation and setup'
|
|
155
|
+
},
|
|
156
|
+
{ id: '3', text: 'Troubleshoot system crash' }
|
|
157
|
+
],
|
|
158
|
+
March: [
|
|
159
|
+
{ id: '4', text: 'Ansible security and updates' },
|
|
160
|
+
{ id: '5', text: 'Red Hat certification' },
|
|
161
|
+
{ id: '6', text: 'Lightspeed user documentation' }
|
|
162
|
+
],
|
|
163
|
+
February: [
|
|
164
|
+
{ id: '7', text: 'Crashing pod assistance' },
|
|
165
|
+
{ id: '8', text: 'OpenShift AI pipelines' },
|
|
166
|
+
{ id: '9', text: 'Updating subscription plan' },
|
|
167
|
+
{ id: '10', text: 'Red Hat licensing options' }
|
|
168
|
+
],
|
|
169
|
+
January: [
|
|
170
|
+
{ id: '11', text: 'RHEL system performance' },
|
|
171
|
+
{ id: '12', text: 'Manage user accounts' }
|
|
172
|
+
]
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
export const EmbeddedChatbotDemo: FunctionComponent = () => {
|
|
176
|
+
const [messages, setMessages] = useState<MessageProps[]>(initialMessages);
|
|
177
|
+
const [selectedModel, setSelectedModel] = useState('Granite 7B');
|
|
178
|
+
const [isSendButtonDisabled, setIsSendButtonDisabled] = useState(false);
|
|
179
|
+
const [isDrawerOpen, setIsDrawerOpen] = useState(false);
|
|
180
|
+
const [conversations, setConversations] = useState<Conversation[] | { [key: string]: Conversation[] }>(
|
|
181
|
+
initialConversations
|
|
182
|
+
);
|
|
183
|
+
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
|
|
184
|
+
const [announcement, setAnnouncement] = useState<string>();
|
|
185
|
+
const scrollToBottomRef = useRef<HTMLDivElement>(null);
|
|
186
|
+
const historyRef = useRef<HTMLButtonElement>(null);
|
|
187
|
+
|
|
188
|
+
const displayMode = ChatbotDisplayMode.embedded;
|
|
189
|
+
// Auto-scrolls to the latest message
|
|
190
|
+
useEffect(() => {
|
|
191
|
+
// don't scroll the first load - in this demo, we know we start with two messages
|
|
192
|
+
if (messages.length > 2) {
|
|
193
|
+
scrollToBottomRef.current?.scrollIntoView({ behavior: 'smooth' });
|
|
194
|
+
}
|
|
195
|
+
}, [messages]);
|
|
196
|
+
|
|
197
|
+
const onSelectModel = (_event: MouseEvent<Element, MouseEvent> | undefined, value: string | number | undefined) => {
|
|
198
|
+
setSelectedModel(value as string);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
// you will likely want to come up with your own unique id function; this is for demo purposes only
|
|
202
|
+
const generateId = () => {
|
|
203
|
+
const id = Date.now() + Math.random();
|
|
204
|
+
return id.toString();
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
const handleSend = (message: string) => {
|
|
208
|
+
setIsSendButtonDisabled(true);
|
|
209
|
+
const newMessages: MessageProps[] = [];
|
|
210
|
+
// We can't use structuredClone since messages contains functions, but we can't mutate
|
|
211
|
+
// items that are going into state or the UI won't update correctly
|
|
212
|
+
messages.forEach((message) => newMessages.push(message));
|
|
213
|
+
// It's important to set a timestamp prop since the Message components re-render.
|
|
214
|
+
// The timestamps re-render with them.
|
|
215
|
+
const date = new Date();
|
|
216
|
+
newMessages.push({
|
|
217
|
+
id: generateId(),
|
|
218
|
+
role: 'user',
|
|
219
|
+
content: message,
|
|
220
|
+
name: 'User',
|
|
221
|
+
avatar: userAvatar,
|
|
222
|
+
timestamp: date.toLocaleString(),
|
|
223
|
+
avatarProps: { isBordered: true }
|
|
224
|
+
});
|
|
225
|
+
newMessages.push({
|
|
226
|
+
id: generateId(),
|
|
227
|
+
role: 'bot',
|
|
228
|
+
content: 'API response goes here',
|
|
229
|
+
name: 'Bot',
|
|
230
|
+
avatar: patternflyAvatar,
|
|
231
|
+
isLoading: true,
|
|
232
|
+
timestamp: date.toLocaleString()
|
|
233
|
+
});
|
|
234
|
+
setMessages(newMessages);
|
|
235
|
+
// make announcement to assistive devices that new messages have been added
|
|
236
|
+
setAnnouncement(`Message from User: ${message}. Message from Bot is loading.`);
|
|
237
|
+
|
|
238
|
+
// this is for demo purposes only; in a real situation, there would be an API response we would wait for
|
|
239
|
+
setTimeout(() => {
|
|
240
|
+
const loadedMessages: MessageProps[] = [];
|
|
241
|
+
// we can't use structuredClone since messages contains functions, but we can't mutate
|
|
242
|
+
// items that are going into state or the UI won't update correctly
|
|
243
|
+
newMessages.forEach((message) => loadedMessages.push(message));
|
|
244
|
+
loadedMessages.pop();
|
|
245
|
+
loadedMessages.push({
|
|
246
|
+
id: generateId(),
|
|
247
|
+
role: 'bot',
|
|
248
|
+
content: 'API response goes here',
|
|
249
|
+
name: 'Bot',
|
|
250
|
+
avatar: patternflyAvatar,
|
|
251
|
+
isLoading: false,
|
|
252
|
+
actions: {
|
|
253
|
+
// eslint-disable-next-line no-console
|
|
254
|
+
positive: { onClick: () => console.log('Good response') },
|
|
255
|
+
// eslint-disable-next-line no-console
|
|
256
|
+
negative: { onClick: () => console.log('Bad response') },
|
|
257
|
+
// eslint-disable-next-line no-console
|
|
258
|
+
copy: { onClick: () => console.log('Copy') },
|
|
259
|
+
// eslint-disable-next-line no-console
|
|
260
|
+
download: { onClick: () => console.log('Download') },
|
|
261
|
+
// eslint-disable-next-line no-console
|
|
262
|
+
listen: { onClick: () => console.log('Listen') }
|
|
263
|
+
},
|
|
264
|
+
timestamp: date.toLocaleString()
|
|
265
|
+
});
|
|
266
|
+
setMessages(loadedMessages);
|
|
267
|
+
// make announcement to assistive devices that new message has loaded
|
|
268
|
+
setAnnouncement(`Message from Bot: API response goes here`);
|
|
269
|
+
setIsSendButtonDisabled(false);
|
|
270
|
+
}, 5000);
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
const findMatchingItems = (targetValue: string) => {
|
|
274
|
+
let filteredConversations = Object.entries(initialConversations).reduce((acc, [key, items]) => {
|
|
275
|
+
const filteredItems = items.filter((item) => item.text.toLowerCase().includes(targetValue.toLowerCase()));
|
|
276
|
+
if (filteredItems.length > 0) {
|
|
277
|
+
acc[key] = filteredItems;
|
|
278
|
+
}
|
|
279
|
+
return acc;
|
|
280
|
+
}, {});
|
|
281
|
+
|
|
282
|
+
// append message if no items are found
|
|
283
|
+
if (Object.keys(filteredConversations).length === 0) {
|
|
284
|
+
filteredConversations = [{ id: '13', noIcon: true, text: 'No results found' }];
|
|
285
|
+
}
|
|
286
|
+
return filteredConversations;
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
const horizontalLogo = (
|
|
290
|
+
<Bullseye>
|
|
291
|
+
<Brand className="show-light" src={PFHorizontalLogoColor} alt="PatternFly" />
|
|
292
|
+
<Brand className="show-dark" src={PFHorizontalLogoReverse} alt="PatternFly" />
|
|
293
|
+
</Bullseye>
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
const masthead = (
|
|
297
|
+
<Masthead>
|
|
298
|
+
<MastheadMain>
|
|
299
|
+
<MastheadToggle>
|
|
300
|
+
<PageToggleButton
|
|
301
|
+
variant="plain"
|
|
302
|
+
aria-label="Global navigation"
|
|
303
|
+
isSidebarOpen={isSidebarOpen}
|
|
304
|
+
onSidebarToggle={() => setIsSidebarOpen(!isSidebarOpen)}
|
|
305
|
+
id="fill-nav-toggle"
|
|
306
|
+
>
|
|
307
|
+
<BarsIcon />
|
|
308
|
+
</PageToggleButton>
|
|
309
|
+
</MastheadToggle>
|
|
310
|
+
<MastheadBrand>
|
|
311
|
+
<MastheadLogo href="https://patternfly.org" target="_blank">
|
|
312
|
+
Logo
|
|
313
|
+
</MastheadLogo>
|
|
314
|
+
</MastheadBrand>
|
|
315
|
+
</MastheadMain>
|
|
316
|
+
</Masthead>
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
const sidebar = (
|
|
320
|
+
<PageSidebar isSidebarOpen={isSidebarOpen} id="fill-sidebar">
|
|
321
|
+
<PageSidebarBody>Navigation</PageSidebarBody>
|
|
322
|
+
</PageSidebar>
|
|
323
|
+
);
|
|
324
|
+
|
|
325
|
+
const skipToChatbot = (event: MouseEvent) => {
|
|
326
|
+
event.preventDefault();
|
|
327
|
+
if (historyRef.current) {
|
|
328
|
+
historyRef.current.focus();
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
const skipToContent = (
|
|
333
|
+
/* You can also add a SkipToContent for your main content here */
|
|
334
|
+
<SkipToContent href="#" onClick={skipToChatbot}>
|
|
335
|
+
Skip to chatbot
|
|
336
|
+
</SkipToContent>
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
return (
|
|
340
|
+
<Page skipToContent={skipToContent} masthead={masthead} sidebar={sidebar} isContentFilled>
|
|
341
|
+
<Chatbot displayMode={displayMode}>
|
|
342
|
+
<ChatbotConversationHistoryNav
|
|
343
|
+
displayMode={displayMode}
|
|
344
|
+
onDrawerToggle={() => {
|
|
345
|
+
setIsDrawerOpen(!isDrawerOpen);
|
|
346
|
+
setConversations(initialConversations);
|
|
347
|
+
}}
|
|
348
|
+
isDrawerOpen={isDrawerOpen}
|
|
349
|
+
setIsDrawerOpen={setIsDrawerOpen}
|
|
350
|
+
activeItemId="1"
|
|
351
|
+
// eslint-disable-next-line no-console
|
|
352
|
+
onSelectActiveItem={(e, selectedItem) => console.log(`Selected history item with id ${selectedItem}`)}
|
|
353
|
+
conversations={conversations}
|
|
354
|
+
onNewChat={() => {
|
|
355
|
+
setIsDrawerOpen(!isDrawerOpen);
|
|
356
|
+
setMessages([]);
|
|
357
|
+
setConversations(initialConversations);
|
|
358
|
+
}}
|
|
359
|
+
handleTextInputChange={(value: string) => {
|
|
360
|
+
if (value === '') {
|
|
361
|
+
setConversations(initialConversations);
|
|
362
|
+
}
|
|
363
|
+
// this is where you would perform search on the items in the drawer
|
|
364
|
+
// and update the state
|
|
365
|
+
const newConversations: { [key: string]: Conversation[] } = findMatchingItems(value);
|
|
366
|
+
setConversations(newConversations);
|
|
367
|
+
}}
|
|
368
|
+
drawerContent={
|
|
369
|
+
<>
|
|
370
|
+
<ChatbotHeader>
|
|
371
|
+
<ChatbotHeaderMain>
|
|
372
|
+
<ChatbotHeaderMenu
|
|
373
|
+
ref={historyRef}
|
|
374
|
+
aria-expanded={isDrawerOpen}
|
|
375
|
+
onMenuToggle={() => setIsDrawerOpen(!isDrawerOpen)}
|
|
376
|
+
/>
|
|
377
|
+
<ChatbotHeaderTitle>{horizontalLogo}</ChatbotHeaderTitle>
|
|
378
|
+
</ChatbotHeaderMain>
|
|
379
|
+
<ChatbotHeaderActions>
|
|
380
|
+
<ChatbotHeaderSelectorDropdown value={selectedModel} onSelect={onSelectModel}>
|
|
381
|
+
<DropdownList>
|
|
382
|
+
<DropdownItem value="Granite 7B" key="granite">
|
|
383
|
+
Granite 7B
|
|
384
|
+
</DropdownItem>
|
|
385
|
+
<DropdownItem value="Llama 3.0" key="llama">
|
|
386
|
+
Llama 3.0
|
|
387
|
+
</DropdownItem>
|
|
388
|
+
<DropdownItem value="Mistral 3B" key="mistral">
|
|
389
|
+
Mistral 3B
|
|
390
|
+
</DropdownItem>
|
|
391
|
+
</DropdownList>
|
|
392
|
+
</ChatbotHeaderSelectorDropdown>
|
|
393
|
+
</ChatbotHeaderActions>
|
|
394
|
+
</ChatbotHeader>
|
|
395
|
+
<ChatbotContent isPrimary>
|
|
396
|
+
{/* Update the announcement prop on MessageBox whenever a new message is sent
|
|
397
|
+
so that users of assistive devices receive sufficient context */}
|
|
398
|
+
<MessageBox announcement={announcement}>
|
|
399
|
+
<ChatbotWelcomePrompt
|
|
400
|
+
title="Hi, ChatBot User!"
|
|
401
|
+
description="How can I help you today?"
|
|
402
|
+
prompts={welcomePrompts}
|
|
403
|
+
/>
|
|
404
|
+
{/* This code block enables scrolling to the top of the last message.
|
|
405
|
+
You can instead choose to move the div with scrollToBottomRef on it below
|
|
406
|
+
the map of messages, so that users are forced to scroll to the bottom.
|
|
407
|
+
If you are using streaming, you will want to take a different approach;
|
|
408
|
+
see: https://github.com/patternfly/chatbot/issues/201#issuecomment-2400725173 */}
|
|
409
|
+
{messages.map((message, index) => {
|
|
410
|
+
if (index === messages.length - 1) {
|
|
411
|
+
return (
|
|
412
|
+
<>
|
|
413
|
+
<div ref={scrollToBottomRef}></div>
|
|
414
|
+
<Message key={message.id} {...message} />
|
|
415
|
+
</>
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
return <Message key={message.id} {...message} />;
|
|
419
|
+
})}
|
|
420
|
+
</MessageBox>
|
|
421
|
+
</ChatbotContent>
|
|
422
|
+
<ChatbotFooter isPrimary>
|
|
423
|
+
<MessageBar
|
|
424
|
+
isPrimary
|
|
425
|
+
onSendMessage={handleSend}
|
|
426
|
+
hasMicrophoneButton
|
|
427
|
+
isSendButtonDisabled={isSendButtonDisabled}
|
|
428
|
+
/>
|
|
429
|
+
<ChatbotFootnote {...footnoteProps} />
|
|
430
|
+
</ChatbotFooter>
|
|
431
|
+
</>
|
|
432
|
+
}
|
|
433
|
+
></ChatbotConversationHistoryNav>
|
|
434
|
+
</Chatbot>
|
|
435
|
+
</Page>
|
|
436
|
+
);
|
|
437
|
+
};
|
|
@@ -11,7 +11,10 @@ import {
|
|
|
11
11
|
DropdownProps,
|
|
12
12
|
Dropdown,
|
|
13
13
|
DropdownToggleProps,
|
|
14
|
-
PopperOptions
|
|
14
|
+
PopperOptions,
|
|
15
|
+
MenuSearchInputProps,
|
|
16
|
+
SearchInputProps,
|
|
17
|
+
MenuSearchProps
|
|
15
18
|
} from '@patternfly/react-core';
|
|
16
19
|
|
|
17
20
|
export interface AttachMenuProps extends DropdownProps {
|
|
@@ -35,6 +38,12 @@ export interface AttachMenuProps extends DropdownProps {
|
|
|
35
38
|
searchInputAriaLabel?: string;
|
|
36
39
|
/** Toggle to be rendered */
|
|
37
40
|
toggle: DropdownToggleProps | ((toggleRef: React.RefObject<any>) => React.ReactNode);
|
|
41
|
+
/** Additional props passed to MenuSearch component */
|
|
42
|
+
menuSearchProps?: Omit<MenuSearchProps, 'ref'>;
|
|
43
|
+
/** Additional props passed to MenuSearchInput component */
|
|
44
|
+
menuSearchInputProps?: Omit<MenuSearchInputProps, 'ref'>;
|
|
45
|
+
/** Additional props passed to SearchInput component */
|
|
46
|
+
searchInputProps?: SearchInputProps;
|
|
38
47
|
}
|
|
39
48
|
|
|
40
49
|
export const AttachMenu: FunctionComponent<AttachMenuProps> = ({
|
|
@@ -49,6 +58,9 @@ export const AttachMenu: FunctionComponent<AttachMenuProps> = ({
|
|
|
49
58
|
searchInputPlaceholder,
|
|
50
59
|
searchInputAriaLabel = 'Filter menu items',
|
|
51
60
|
toggle,
|
|
61
|
+
menuSearchProps,
|
|
62
|
+
menuSearchInputProps,
|
|
63
|
+
searchInputProps,
|
|
52
64
|
...props
|
|
53
65
|
}: AttachMenuProps) => (
|
|
54
66
|
<Dropdown
|
|
@@ -61,12 +73,13 @@ export const AttachMenu: FunctionComponent<AttachMenuProps> = ({
|
|
|
61
73
|
onSelect={onSelect}
|
|
62
74
|
{...props}
|
|
63
75
|
>
|
|
64
|
-
<MenuSearch>
|
|
65
|
-
<MenuSearchInput>
|
|
76
|
+
<MenuSearch {...menuSearchProps}>
|
|
77
|
+
<MenuSearchInput {...menuSearchInputProps}>
|
|
66
78
|
<SearchInput
|
|
67
79
|
aria-label={searchInputAriaLabel}
|
|
68
80
|
onChange={(_event, value) => handleTextInputChange(value)}
|
|
69
81
|
placeholder={searchInputPlaceholder}
|
|
82
|
+
{...searchInputProps}
|
|
70
83
|
/>
|
|
71
84
|
</MenuSearchInput>
|
|
72
85
|
</MenuSearch>
|
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
flex-direction: column;
|
|
12
12
|
row-gap: var(--pf-chatbot__footer--RowGap);
|
|
13
13
|
position: relative; // this is so focus ring on parent chatbot doesn't include footer
|
|
14
|
+
|
|
15
|
+
&.pf-m-primary {
|
|
16
|
+
background-color: var(--pf-t--global--background--color--primary--default);
|
|
17
|
+
}
|
|
14
18
|
}
|
|
15
19
|
.pf-chatbot__footer-container {
|
|
16
20
|
padding: 0 var(--pf-t--global--spacer--lg) var(--pf-t--global--spacer--lg) var(--pf-t--global--spacer--lg);
|
|
@@ -15,10 +15,19 @@ describe('ChatbotFooter', () => {
|
|
|
15
15
|
|
|
16
16
|
it('should handle isCompact', () => {
|
|
17
17
|
render(
|
|
18
|
-
<ChatbotFooter
|
|
18
|
+
<ChatbotFooter isCompact data-testid="footer">
|
|
19
19
|
Chatbot Content
|
|
20
20
|
</ChatbotFooter>
|
|
21
21
|
);
|
|
22
22
|
expect(screen.getByTestId('footer')).toHaveClass('pf-m-compact');
|
|
23
23
|
});
|
|
24
|
+
|
|
25
|
+
it('should handle isPrimary', () => {
|
|
26
|
+
render(
|
|
27
|
+
<ChatbotFooter isPrimary data-testid="footer">
|
|
28
|
+
Chatbot Content
|
|
29
|
+
</ChatbotFooter>
|
|
30
|
+
);
|
|
31
|
+
expect(screen.getByTestId('footer')).toHaveClass('pf-m-primary');
|
|
32
|
+
});
|
|
24
33
|
});
|
|
@@ -13,20 +13,27 @@ import type { HTMLProps, FunctionComponent } from 'react';
|
|
|
13
13
|
import { Divider } from '@patternfly/react-core';
|
|
14
14
|
|
|
15
15
|
export interface ChatbotFooterProps extends HTMLProps<HTMLDivElement> {
|
|
16
|
-
/** Children for the
|
|
16
|
+
/** Children for the footer - supports MessageBar and FootNote components*/
|
|
17
17
|
children?: React.ReactNode;
|
|
18
|
-
/** Custom classname for the
|
|
18
|
+
/** Custom classname for the footer component */
|
|
19
19
|
className?: string;
|
|
20
|
+
/** Sets footer to compact styling. */
|
|
20
21
|
isCompact?: boolean;
|
|
22
|
+
/** Sets background color to primary */
|
|
23
|
+
isPrimary?: boolean;
|
|
21
24
|
}
|
|
22
25
|
|
|
23
26
|
export const ChatbotFooter: FunctionComponent<ChatbotFooterProps> = ({
|
|
24
27
|
children,
|
|
25
28
|
className,
|
|
26
29
|
isCompact,
|
|
30
|
+
isPrimary,
|
|
27
31
|
...props
|
|
28
32
|
}: ChatbotFooterProps) => (
|
|
29
|
-
<div
|
|
33
|
+
<div
|
|
34
|
+
className={`pf-chatbot__footer ${isCompact ? 'pf-m-compact' : ''} ${isPrimary ? 'pf-m-primary' : ''} ${className ?? ''}`}
|
|
35
|
+
{...props}
|
|
36
|
+
>
|
|
30
37
|
<Divider />
|
|
31
38
|
<div className="pf-chatbot__footer-container">{children}</div>
|
|
32
39
|
</div>
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import '@testing-library/jest-dom';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
DropdownGroup,
|
|
4
|
+
DropdownItem,
|
|
5
|
+
DropdownList,
|
|
6
|
+
MenuSearchInputProps,
|
|
7
|
+
MenuSearchProps
|
|
8
|
+
} from '@patternfly/react-core';
|
|
3
9
|
import { BellIcon, CalendarAltIcon, ClipboardIcon, CodeIcon } from '@patternfly/react-icons';
|
|
4
10
|
import { render, screen } from '@testing-library/react';
|
|
5
11
|
import userEvent from '@testing-library/user-event';
|
|
@@ -218,6 +224,57 @@ describe('Message bar', () => {
|
|
|
218
224
|
await userEvent.click(attachButton);
|
|
219
225
|
expect(attachToggleClickSpy).toHaveBeenCalledTimes(1);
|
|
220
226
|
});
|
|
227
|
+
it('can pass searchInputProps to search input in AttachMenu', () => {
|
|
228
|
+
render(
|
|
229
|
+
<MessageBar
|
|
230
|
+
onSendMessage={jest.fn}
|
|
231
|
+
value="test"
|
|
232
|
+
attachMenuProps={{
|
|
233
|
+
isAttachMenuOpen: true,
|
|
234
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
235
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
236
|
+
onAttachMenuInputChange: jest.fn(),
|
|
237
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
238
|
+
searchInputProps: { isDisabled: true }
|
|
239
|
+
}}
|
|
240
|
+
/>
|
|
241
|
+
);
|
|
242
|
+
expect(screen.getByRole('textbox', { name: /Filter menu items/i })).toBeDisabled();
|
|
243
|
+
});
|
|
244
|
+
it('can pass menuSearchProps to search input in AttachMenu', () => {
|
|
245
|
+
render(
|
|
246
|
+
<MessageBar
|
|
247
|
+
onSendMessage={jest.fn}
|
|
248
|
+
value="test"
|
|
249
|
+
attachMenuProps={{
|
|
250
|
+
isAttachMenuOpen: true,
|
|
251
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
252
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
253
|
+
onAttachMenuInputChange: jest.fn(),
|
|
254
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
255
|
+
menuSearchProps: { 'data-testid': 'menu-search' } as MenuSearchProps
|
|
256
|
+
}}
|
|
257
|
+
/>
|
|
258
|
+
);
|
|
259
|
+
expect(screen.getByTestId('menu-search')).toBeTruthy();
|
|
260
|
+
});
|
|
261
|
+
it('can pass menuSearchInputProps to search input in AttachMenu', () => {
|
|
262
|
+
render(
|
|
263
|
+
<MessageBar
|
|
264
|
+
onSendMessage={jest.fn}
|
|
265
|
+
value="test"
|
|
266
|
+
attachMenuProps={{
|
|
267
|
+
isAttachMenuOpen: true,
|
|
268
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
269
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
270
|
+
onAttachMenuInputChange: jest.fn(),
|
|
271
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
272
|
+
menuSearchInputProps: { 'data-testid': 'menu-search-input' } as MenuSearchInputProps
|
|
273
|
+
}}
|
|
274
|
+
/>
|
|
275
|
+
);
|
|
276
|
+
expect(screen.getByTestId('menu-search-input')).toBeTruthy();
|
|
277
|
+
});
|
|
221
278
|
it('can hide attach button', () => {
|
|
222
279
|
render(<MessageBar onSendMessage={jest.fn} hasAttachButton={false} />);
|
|
223
280
|
expect(screen.queryByRole('button', { name: 'Attach' })).toBeFalsy();
|
|
@@ -387,4 +444,8 @@ describe('Message bar', () => {
|
|
|
387
444
|
ref.current?.focus();
|
|
388
445
|
expect(document.activeElement).toBe(screen.getByRole('textbox'));
|
|
389
446
|
});
|
|
447
|
+
it('should handle isPrimary', () => {
|
|
448
|
+
const { container } = render(<MessageBar isPrimary onSendMessage={jest.fn} />);
|
|
449
|
+
expect(container.querySelector('.pf-m-primary')).toBeTruthy();
|
|
450
|
+
});
|
|
390
451
|
});
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import type { ChangeEvent, FunctionComponent, KeyboardEvent as ReactKeyboardEvent, Ref } from 'react';
|
|
2
2
|
import { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
|
|
3
3
|
import { Accept, DropEvent, DropzoneOptions, FileError, FileRejection } from 'react-dropzone';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
ButtonProps,
|
|
6
|
+
MenuSearchInputProps,
|
|
7
|
+
MenuSearchProps,
|
|
8
|
+
SearchInputProps,
|
|
9
|
+
TextArea,
|
|
10
|
+
TextAreaProps,
|
|
11
|
+
TooltipProps
|
|
12
|
+
} from '@patternfly/react-core';
|
|
5
13
|
|
|
6
14
|
// Import Chatbot components
|
|
7
15
|
import SendButton from './SendButton';
|
|
@@ -30,6 +38,12 @@ export interface MessageBarWithAttachMenuProps {
|
|
|
30
38
|
onAttachMenuOnOpenChangeKeys?: string[];
|
|
31
39
|
/** Callback to change the open state of the menu. Triggered by clicking outside of the menu. */
|
|
32
40
|
onAttachMenuOpenChange?: (isOpen: boolean) => void;
|
|
41
|
+
/** Additional props passed to MenuSearch component in attach menu */
|
|
42
|
+
menuSearchProps?: Omit<MenuSearchProps, 'ref'>;
|
|
43
|
+
/** Additional props passed to MenuSearchInput component in attach menu */
|
|
44
|
+
menuSearchInputProps?: Omit<MenuSearchInputProps, 'ref'>;
|
|
45
|
+
/** Additional props passed to SearchInput component in attach menu */
|
|
46
|
+
searchInputProps?: SearchInputProps;
|
|
33
47
|
}
|
|
34
48
|
|
|
35
49
|
export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
|
|
@@ -104,6 +118,8 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
|
|
|
104
118
|
isCompact?: boolean;
|
|
105
119
|
/** Ref applied to message bar textarea, for use with focus or other custom behaviors */
|
|
106
120
|
innerRef?: React.Ref<HTMLTextAreaElement>;
|
|
121
|
+
/** Sets background color to primary */
|
|
122
|
+
isPrimary?: boolean;
|
|
107
123
|
}
|
|
108
124
|
|
|
109
125
|
export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
@@ -134,6 +150,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
134
150
|
validator,
|
|
135
151
|
dropzoneProps,
|
|
136
152
|
innerRef,
|
|
153
|
+
isPrimary,
|
|
137
154
|
...props
|
|
138
155
|
}: MessageBarProps) => {
|
|
139
156
|
// Text Input
|
|
@@ -449,11 +466,16 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
449
466
|
{...(attachMenuProps && { handleTextInputChange: attachMenuProps.onAttachMenuInputChange })}
|
|
450
467
|
popperProps={{ direction: 'up', distance: 8 }}
|
|
451
468
|
searchInputPlaceholder={attachMenuProps?.attachMenuInputPlaceholder}
|
|
469
|
+
{...attachMenuProps}
|
|
452
470
|
/>
|
|
453
471
|
);
|
|
454
472
|
}
|
|
455
473
|
|
|
456
|
-
return
|
|
474
|
+
return (
|
|
475
|
+
<div className={`pf-chatbot__message-bar ${isPrimary ? 'pf-m-primary' : ''} ${className ?? ''}`}>
|
|
476
|
+
{messageBarContents}
|
|
477
|
+
</div>
|
|
478
|
+
);
|
|
457
479
|
};
|
|
458
480
|
|
|
459
481
|
const MessageBar = forwardRef((props: MessageBarProps, ref: Ref<HTMLTextAreaElement>) => (
|