@patternfly/chatbot 6.5.0-prerelease.20 → 6.5.0-prerelease.21
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/Message/Message.d.ts +15 -3
- package/dist/cjs/Message/Message.js +1 -1
- package/dist/cjs/Message/Message.test.js +125 -2
- package/dist/css/main.css +10 -0
- package/dist/css/main.css.map +1 -1
- package/dist/esm/Message/Message.d.ts +15 -3
- package/dist/esm/Message/Message.js +1 -1
- package/dist/esm/Message/Message.test.js +125 -2
- package/package.json +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMultipleActionGroups.tsx +61 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +18 -0
- package/src/Message/Message.test.tsx +198 -2
- package/src/Message/Message.tsx +35 -6
- package/src/ResponseActions/ResponseActions.scss +11 -0
|
@@ -60,12 +60,24 @@ export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
|
|
|
60
60
|
isLoading?: boolean;
|
|
61
61
|
/** Array of attachments attached to a message */
|
|
62
62
|
attachments?: MessageAttachment[];
|
|
63
|
-
/** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen
|
|
63
|
+
/** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen.
|
|
64
|
+
* Can be a single actions object or an array of action group objects. When passing an array, you can pass an object of actions or
|
|
65
|
+
* an object that contains an actions property for finer control of selection persistence.
|
|
66
|
+
*/
|
|
64
67
|
actions?: {
|
|
65
68
|
[key: string]: ActionProps;
|
|
66
|
-
}
|
|
69
|
+
} | {
|
|
70
|
+
[key: string]: ActionProps;
|
|
71
|
+
}[] | {
|
|
72
|
+
actions: {
|
|
73
|
+
[key: string]: ActionProps;
|
|
74
|
+
};
|
|
75
|
+
persistActionSelection?: boolean;
|
|
76
|
+
}[];
|
|
67
77
|
/** When true, the selected action will persist even when clicking outside the component.
|
|
68
|
-
* When false (default), clicking outside or clicking another action will deselect the current selection.
|
|
78
|
+
* When false (default), clicking outside or clicking another action will deselect the current selection.
|
|
79
|
+
* For finer control of multiple action groups, use persistActionSelection on each group.
|
|
80
|
+
*/
|
|
69
81
|
persistActionSelection?: boolean;
|
|
70
82
|
/** Sources for message */
|
|
71
83
|
sources?: SourcesCardProps;
|
|
@@ -219,7 +219,7 @@ const MessageBase = (_a) => {
|
|
|
219
219
|
}
|
|
220
220
|
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [beforeMainContent && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: beforeMainContent }), error ? (0, jsx_runtime_1.jsx)(ErrorMessage_1.default, Object.assign({}, error)) : handleMarkdown()] }));
|
|
221
221
|
};
|
|
222
|
-
return ((0, jsx_runtime_1.jsxs)("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}`, "aria-live": isLiveRegion ? 'polite' : undefined, "aria-atomic": isLiveRegion ? false : undefined, ref: innerRef }, props, { children: [avatar && ((0, jsx_runtime_1.jsx)(react_core_1.Avatar, Object.assign({ className: `pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`, src: avatar, alt: "" }, avatarProps))), (0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-contents", children: [(0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-meta", children: [name && ((0, jsx_runtime_1.jsx)("span", { className: "pf-chatbot__message-name", children: (0, jsx_runtime_1.jsx)(react_core_1.Truncate, { content: name }) })), role === 'bot' && ((0, jsx_runtime_1.jsx)(react_core_1.Label, { variant: "outline", isCompact: true, children: botWord })), (0, jsx_runtime_1.jsx)(react_core_1.Timestamp, { date: date, children: timestamp })] }), (0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-response", children: [(0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-and-actions", children: [renderMessage(), afterMainContent && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: afterMainContent }), toolResponse && (0, jsx_runtime_1.jsx)(ToolResponse_1.default, Object.assign({}, toolResponse)), deepThinking && (0, jsx_runtime_1.jsx)(DeepThinking_1.default, Object.assign({}, deepThinking)), toolCall && (0, jsx_runtime_1.jsx)(ToolCall_1.default, Object.assign({}, toolCall)), !isLoading && sources && (0, jsx_runtime_1.jsx)(SourcesCard_1.default, Object.assign({}, sources, { isCompact: isCompact })), quickStarts && quickStarts.quickStart && ((0, jsx_runtime_1.jsx)(QuickStartTile_1.default, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel, isCompact: isCompact })), !isLoading && !isEditable && actions && ((0, jsx_runtime_1.jsx)(ResponseActions_1.default, { actions: actions, persistActionSelection: persistActionSelection })), userFeedbackForm && (0, jsx_runtime_1.jsx)(UserFeedback_1.default, Object.assign({}, userFeedbackForm, { timestamp: dateString, isCompact: isCompact })), userFeedbackComplete && ((0, jsx_runtime_1.jsx)(UserFeedbackComplete_1.default, Object.assign({}, userFeedbackComplete, { timestamp: dateString, isCompact: isCompact }))), !isLoading && quickResponses && ((0, jsx_runtime_1.jsx)(QuickResponse_1.default, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps, isCompact: isCompact }))] }), attachments && ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__message-attachments-container", children: attachments.map((attachment) => {
|
|
222
|
+
return ((0, jsx_runtime_1.jsxs)("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}`, "aria-live": isLiveRegion ? 'polite' : undefined, "aria-atomic": isLiveRegion ? false : undefined, ref: innerRef }, props, { children: [avatar && ((0, jsx_runtime_1.jsx)(react_core_1.Avatar, Object.assign({ className: `pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`, src: avatar, alt: "" }, avatarProps))), (0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-contents", children: [(0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-meta", children: [name && ((0, jsx_runtime_1.jsx)("span", { className: "pf-chatbot__message-name", children: (0, jsx_runtime_1.jsx)(react_core_1.Truncate, { content: name }) })), role === 'bot' && ((0, jsx_runtime_1.jsx)(react_core_1.Label, { variant: "outline", isCompact: true, children: botWord })), (0, jsx_runtime_1.jsx)(react_core_1.Timestamp, { date: date, children: timestamp })] }), (0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-response", children: [(0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__message-and-actions", children: [renderMessage(), afterMainContent && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: afterMainContent }), toolResponse && (0, jsx_runtime_1.jsx)(ToolResponse_1.default, Object.assign({}, toolResponse)), deepThinking && (0, jsx_runtime_1.jsx)(DeepThinking_1.default, Object.assign({}, deepThinking)), toolCall && (0, jsx_runtime_1.jsx)(ToolCall_1.default, Object.assign({}, toolCall)), !isLoading && sources && (0, jsx_runtime_1.jsx)(SourcesCard_1.default, Object.assign({}, sources, { isCompact: isCompact })), quickStarts && quickStarts.quickStart && ((0, jsx_runtime_1.jsx)(QuickStartTile_1.default, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel, isCompact: isCompact })), !isLoading && !isEditable && actions && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: Array.isArray(actions) ? ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__response-actions-groups", children: actions.map((actionGroup, index) => ((0, jsx_runtime_1.jsx)(ResponseActions_1.default, { actions: actionGroup.actions || actionGroup, persistActionSelection: persistActionSelection || actionGroup.persistActionSelection }, index))) })) : ((0, jsx_runtime_1.jsx)(ResponseActions_1.default, { actions: actions, persistActionSelection: persistActionSelection })) })), userFeedbackForm && (0, jsx_runtime_1.jsx)(UserFeedback_1.default, Object.assign({}, userFeedbackForm, { timestamp: dateString, isCompact: isCompact })), userFeedbackComplete && ((0, jsx_runtime_1.jsx)(UserFeedbackComplete_1.default, Object.assign({}, userFeedbackComplete, { timestamp: dateString, isCompact: isCompact }))), !isLoading && quickResponses && ((0, jsx_runtime_1.jsx)(QuickResponse_1.default, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps, isCompact: isCompact }))] }), attachments && ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__message-attachments-container", children: attachments.map((attachment) => {
|
|
223
223
|
var _a;
|
|
224
224
|
return ((0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__message-attachment", children: (0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, { fileName: attachment.name, fileId: attachment.id, onClose: attachment.onClose, onClick: attachment.onClick, isLoading: attachment.isLoading, closeButtonAriaLabel: attachment.closeButtonAriaLabel, languageTestId: attachment.languageTestId, spinnerTestId: attachment.spinnerTestId, variant: isPrimary ? 'outline' : undefined }) }, (_a = attachment.id) !== null && _a !== void 0 ? _a : attachment.name));
|
|
225
225
|
}) })), !isLoading && endContent && (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: endContent })] })] })] })));
|
|
@@ -360,7 +360,7 @@ describe('Message', () => {
|
|
|
360
360
|
expect(react_2.screen.queryByRole('button', { name: /No/i })).toBeFalsy();
|
|
361
361
|
expect(react_2.screen.getByRole('button', { name: /1 more/i }));
|
|
362
362
|
}));
|
|
363
|
-
it('
|
|
363
|
+
it('Renders response actions when a single actions object is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
364
364
|
(0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", actions: {
|
|
365
365
|
// eslint-disable-next-line no-console
|
|
366
366
|
positive: { onClick: () => console.log('Good response') },
|
|
@@ -378,9 +378,132 @@ describe('Message', () => {
|
|
|
378
378
|
listen: { onClick: () => console.log('Listen') }
|
|
379
379
|
} }));
|
|
380
380
|
ALL_ACTIONS.forEach(({ label }) => {
|
|
381
|
-
expect(react_2.screen.getByRole('button', { name: label })).
|
|
381
|
+
expect(react_2.screen.getByRole('button', { name: label })).toBeVisible();
|
|
382
382
|
});
|
|
383
383
|
}));
|
|
384
|
+
it('Renders response actions when an array of actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
385
|
+
(0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", actions: [
|
|
386
|
+
{
|
|
387
|
+
// eslint-disable-next-line no-console
|
|
388
|
+
positive: { onClick: () => console.log('Good response') },
|
|
389
|
+
// eslint-disable-next-line no-console
|
|
390
|
+
negative: { onClick: () => console.log('Bad response') }
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
// eslint-disable-next-line no-console
|
|
394
|
+
copy: { onClick: () => console.log('Copy') },
|
|
395
|
+
// eslint-disable-next-line no-console
|
|
396
|
+
edit: { onClick: () => console.log('Edit') },
|
|
397
|
+
// eslint-disable-next-line no-console
|
|
398
|
+
share: { onClick: () => console.log('Share') },
|
|
399
|
+
// eslint-disable-next-line no-console
|
|
400
|
+
download: { onClick: () => console.log('Download') }
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
// eslint-disable-next-line no-console
|
|
404
|
+
listen: { onClick: () => console.log('Listen') }
|
|
405
|
+
}
|
|
406
|
+
] }));
|
|
407
|
+
ALL_ACTIONS.forEach(({ label }) => {
|
|
408
|
+
expect(react_2.screen.getByRole('button', { name: label })).toBeVisible();
|
|
409
|
+
});
|
|
410
|
+
}));
|
|
411
|
+
it('Renders response actions when an array of objects containing actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
412
|
+
(0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", actions: [
|
|
413
|
+
{
|
|
414
|
+
actions: {
|
|
415
|
+
// eslint-disable-next-line no-console
|
|
416
|
+
positive: { onClick: () => console.log('Good response') },
|
|
417
|
+
// eslint-disable-next-line no-console
|
|
418
|
+
negative: { onClick: () => console.log('Bad response') }
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
actions: {
|
|
423
|
+
// eslint-disable-next-line no-console
|
|
424
|
+
copy: { onClick: () => console.log('Copy') },
|
|
425
|
+
// eslint-disable-next-line no-console
|
|
426
|
+
edit: { onClick: () => console.log('Edit') },
|
|
427
|
+
// eslint-disable-next-line no-console
|
|
428
|
+
share: { onClick: () => console.log('Share') },
|
|
429
|
+
// eslint-disable-next-line no-console
|
|
430
|
+
download: { onClick: () => console.log('Download') }
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
actions: {
|
|
435
|
+
// eslint-disable-next-line no-console
|
|
436
|
+
listen: { onClick: () => console.log('Listen') }
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
] }));
|
|
440
|
+
ALL_ACTIONS.forEach(({ label }) => {
|
|
441
|
+
expect(react_2.screen.getByRole('button', { name: label })).toBeVisible();
|
|
442
|
+
});
|
|
443
|
+
}));
|
|
444
|
+
it('should handle persistActionSelection correctly when a single actions object is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
445
|
+
(0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Test message", persistActionSelection: true, actions: {
|
|
446
|
+
positive: { onClick: jest.fn() },
|
|
447
|
+
negative: { onClick: jest.fn() }
|
|
448
|
+
} }));
|
|
449
|
+
const goodBtn = react_2.screen.getByRole('button', { name: /Good response/i });
|
|
450
|
+
const badBtn = react_2.screen.getByRole('button', { name: /Bad response/i });
|
|
451
|
+
yield user_event_1.default.click(goodBtn);
|
|
452
|
+
expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
453
|
+
yield user_event_1.default.click(react_2.screen.getByText('Test message'));
|
|
454
|
+
expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
455
|
+
yield user_event_1.default.click(badBtn);
|
|
456
|
+
expect(react_2.screen.getByRole('button', { name: /Bad response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
457
|
+
expect(goodBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
458
|
+
}));
|
|
459
|
+
it('should handle persistActionSelection correctly when an array of actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
460
|
+
(0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Test message", persistActionSelection: true, actions: [
|
|
461
|
+
{
|
|
462
|
+
positive: { onClick: jest.fn() },
|
|
463
|
+
negative: { onClick: jest.fn() }
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
copy: { onClick: jest.fn() }
|
|
467
|
+
}
|
|
468
|
+
] }));
|
|
469
|
+
const goodBtn = react_2.screen.getByRole('button', { name: /Good response/i });
|
|
470
|
+
const copyBtn = react_2.screen.getByRole('button', { name: /Copy/i });
|
|
471
|
+
yield user_event_1.default.click(goodBtn);
|
|
472
|
+
expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
473
|
+
yield user_event_1.default.click(react_2.screen.getByText('Test message'));
|
|
474
|
+
expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
475
|
+
yield user_event_1.default.click(copyBtn);
|
|
476
|
+
expect(react_2.screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
477
|
+
yield user_event_1.default.click(react_2.screen.getByText('Test message'));
|
|
478
|
+
expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
479
|
+
expect(react_2.screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
480
|
+
}));
|
|
481
|
+
it('should handle persistActionSelection correctly when an array of objects containing actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
482
|
+
(0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Test message", actions: [
|
|
483
|
+
{
|
|
484
|
+
actions: {
|
|
485
|
+
positive: { onClick: jest.fn() },
|
|
486
|
+
negative: { onClick: jest.fn() }
|
|
487
|
+
},
|
|
488
|
+
persistActionSelection: true
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
actions: {
|
|
492
|
+
copy: { onClick: jest.fn() }
|
|
493
|
+
},
|
|
494
|
+
persistActionSelection: false
|
|
495
|
+
}
|
|
496
|
+
] }));
|
|
497
|
+
const goodBtn = react_2.screen.getByRole('button', { name: /Good response/i });
|
|
498
|
+
const copyBtn = react_2.screen.getByRole('button', { name: /Copy/i });
|
|
499
|
+
yield user_event_1.default.click(goodBtn);
|
|
500
|
+
expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
501
|
+
yield user_event_1.default.click(copyBtn);
|
|
502
|
+
expect(react_2.screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
503
|
+
yield user_event_1.default.click(react_2.screen.getByText('Test message'));
|
|
504
|
+
expect(react_2.screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
505
|
+
expect(copyBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
506
|
+
}));
|
|
384
507
|
it('should not show actions if loading', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
385
508
|
(0, react_2.render)((0, jsx_runtime_1.jsx)(Message_1.default, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", isLoading: true, actions: {
|
|
386
509
|
// eslint-disable-next-line no-console
|
package/dist/css/main.css
CHANGED
|
@@ -2518,6 +2518,16 @@ li[id*=user-content-fn-]:has(> span > span > .pf-chatbot__message-text + .pf-cha
|
|
|
2518
2518
|
--pf-v6-c-button--BackgroundColor: var(--pf-v6-c-button--hover--BackgroundColor);
|
|
2519
2519
|
}
|
|
2520
2520
|
|
|
2521
|
+
.pf-chatbot__response-actions-groups {
|
|
2522
|
+
display: grid;
|
|
2523
|
+
grid-auto-flow: column;
|
|
2524
|
+
grid-auto-columns: max-content;
|
|
2525
|
+
gap: var(--pf-t--global--spacer--xs);
|
|
2526
|
+
}
|
|
2527
|
+
.pf-chatbot__response-actions-groups .pf-chatbot__response-actions {
|
|
2528
|
+
display: flex;
|
|
2529
|
+
}
|
|
2530
|
+
|
|
2521
2531
|
.pf-v6-c-button.pf-chatbot__button--response-action-clicked.pf-v6-c-button.pf-m-plain.pf-m-small {
|
|
2522
2532
|
--pf-v6-c-button--m-plain--BackgroundColor: var(--pf-t--global--background--color--action--plain--alt--clicked);
|
|
2523
2533
|
--pf-v6-c-button__icon--Color: var(--pf-t--global--icon--color--regular);
|
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/Onboarding/Onboarding.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;EAYF;;AAVA;EACE;EACA;EACA;;AAEF;EACE;EACA;;AAQF;EAjCF;IAkCI;IACA;;;AAIF;EAvCF;IAwCI;;;;AAOJ;EAEE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;EAfF;IAgBI;;;;AAOJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMF;EAEE;EACA;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;;AAEA;EACE;;AAGF;EAdF;IAgBI;;;;AAMF;EACE;;;AAOJ;EACE;;;ACjKF;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;EAEA;EACA;EACA;;AAEF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EAEA;;AAIF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EAEA;;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;;;ACrRN;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;;;AAQA;EAIM;AAAA;IACE;;;;AC5EV;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;EACE;;AAGF;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;;;AAQA;EAGI;AAAA;IACE;;;;AClLR;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAIF;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;;;ACpGF;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;EAKE;;AAJA;EACE;EACA;;AAOJ;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;;;AChJF;EACE;EACA;EACA;EACA;EAEA;;AAGA;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;;;AAIJ;EACE;;;ACtDJ;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;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAKF;EACE;EACA;;;AChGJ;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;;AAIA;EACE;;;AAWN;EAIE;;;AAIF;EAKE;;;AAIA;EACE;;;AAKF;EACE;EACA;EACA;EACA;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAIJ;EACE;;AAGF;EACE;EACA;;;AASF;EACE;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;;ACvIN;EACE;EACA;;AACA;EACE;EACA;;;AJ0JF;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAIA;EACE;EACA;;AAIJ;EACE;;;AEjLJ;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;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAKF;EACE;EACA;;;AGpGJ;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;;AAIA;EACE;;;AAWN;EAIE;;;AAIF;EAKE;;;AAIA;EACE;;;AAKF;EACE;EACA;EACA;EACA;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAIJ;EACE;;AAGF;EACE;EACA;;;AASF;EACE;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;;AGnIN;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;EAEA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;ANtBJ;EACE;EACA;EACA;EACA;EAEA;;AAGA;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;;;AAIJ;EACE;;;AOzDJ;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;EAEA;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;;;ACpEN;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;EAEA;EACA;EAEA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAKF;EACE;;AAKF;EACE;EACA;;AAKF;EACE;EACA;;AAIJ;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;;;AASA;EACE;;;AC9JN;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;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;;AAIF;EACE;IACE;IACA;;;;AASF;AAAA;AAAA;EACE;EACA;;;AAKN;AAAA;EAGE;;AAEA;AAAA;EACE;;;AAKF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;;AClGJ;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;;;ACUJ;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/Onboarding/Onboarding.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;EAYF;;AAVA;EACE;EACA;EACA;;AAEF;EACE;EACA;;AAQF;EAjCF;IAkCI;IACA;;;AAIF;EAvCF;IAwCI;;;;AAOJ;EAEE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;EAfF;IAgBI;;;;AAOJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMF;EAEE;EACA;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;;AAEA;EACE;;AAGF;EAdF;IAgBI;;;;AAMF;EACE;;;AAOJ;EACE;;;ACjKF;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;EAEA;EACA;EACA;;AAEF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EAEA;;AAIF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EAEA;;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;;;ACrRN;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;;;AAQA;EAIM;AAAA;IACE;;;;AC5EV;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;EACE;;AAGF;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;;;AAQA;EAGI;AAAA;IACE;;;;AClLR;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAIF;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;;;ACpGF;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;EAKE;;AAJA;EACE;EACA;;AAOJ;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;;;AChJF;EACE;EACA;EACA;EACA;EAEA;;AAGA;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;;;AAIJ;EACE;;;ACtDJ;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;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAKF;EACE;EACA;;;AChGJ;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;;AAIA;EACE;;;AAWN;EAIE;;;AAIF;EAKE;;;AAIA;EACE;;;AAKF;EACE;EACA;EACA;EACA;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAIJ;EACE;;AAGF;EACE;EACA;;;AASF;EACE;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;;ACvIN;EACE;EACA;;AACA;EACE;EACA;;;AJ0JF;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAIA;EACE;EACA;;AAIJ;EACE;;;AEjLJ;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;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAKF;EACE;EACA;;;AGpGJ;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;;AAIA;EACE;;;AAWN;EAIE;;;AAIF;EAKE;;;AAIA;EACE;;;AAKF;EACE;EACA;EACA;EACA;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAIJ;EACE;;AAGF;EACE;EACA;;;AASF;EACE;;AACA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;EACA;;;AGnIN;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;EAEA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;ANtBJ;EACE;EACA;EACA;EACA;EAEA;;AAGA;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;;;AAIJ;EACE;;;AOzDJ;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;EAEA;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;;;ACpEN;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;EAEA;EACA;EAEA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAKF;EACE;;AAKF;EACE;EACA;;AAKF;EACE;EACA;;AAIJ;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;;;AASA;EACE;;;AC9JN;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;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;;AAIF;EACE;IACE;IACA;;;;AASF;AAAA;AAAA;EACE;EACA;;;AAKN;AAAA;EAGE;;AAEA;AAAA;EACE;;;AAKF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;;AClGJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;ACrCF;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;;;ACUJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA","file":"main.css"}
|
|
@@ -60,12 +60,24 @@ export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
|
|
|
60
60
|
isLoading?: boolean;
|
|
61
61
|
/** Array of attachments attached to a message */
|
|
62
62
|
attachments?: MessageAttachment[];
|
|
63
|
-
/** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen
|
|
63
|
+
/** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen.
|
|
64
|
+
* Can be a single actions object or an array of action group objects. When passing an array, you can pass an object of actions or
|
|
65
|
+
* an object that contains an actions property for finer control of selection persistence.
|
|
66
|
+
*/
|
|
64
67
|
actions?: {
|
|
65
68
|
[key: string]: ActionProps;
|
|
66
|
-
}
|
|
69
|
+
} | {
|
|
70
|
+
[key: string]: ActionProps;
|
|
71
|
+
}[] | {
|
|
72
|
+
actions: {
|
|
73
|
+
[key: string]: ActionProps;
|
|
74
|
+
};
|
|
75
|
+
persistActionSelection?: boolean;
|
|
76
|
+
}[];
|
|
67
77
|
/** When true, the selected action will persist even when clicking outside the component.
|
|
68
|
-
* When false (default), clicking outside or clicking another action will deselect the current selection.
|
|
78
|
+
* When false (default), clicking outside or clicking another action will deselect the current selection.
|
|
79
|
+
* For finer control of multiple action groups, use persistActionSelection on each group.
|
|
80
|
+
*/
|
|
69
81
|
persistActionSelection?: boolean;
|
|
70
82
|
/** Sources for message */
|
|
71
83
|
sources?: SourcesCardProps;
|
|
@@ -213,7 +213,7 @@ export const MessageBase = (_a) => {
|
|
|
213
213
|
}
|
|
214
214
|
return (_jsxs(_Fragment, { children: [beforeMainContent && _jsx(_Fragment, { children: beforeMainContent }), error ? _jsx(ErrorMessage, Object.assign({}, error)) : handleMarkdown()] }));
|
|
215
215
|
};
|
|
216
|
-
return (_jsxs("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}`, "aria-live": isLiveRegion ? 'polite' : undefined, "aria-atomic": isLiveRegion ? false : undefined, ref: innerRef }, props, { children: [avatar && (_jsx(Avatar, Object.assign({ className: `pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`, src: avatar, alt: "" }, avatarProps))), _jsxs("div", { className: "pf-chatbot__message-contents", children: [_jsxs("div", { className: "pf-chatbot__message-meta", children: [name && (_jsx("span", { className: "pf-chatbot__message-name", children: _jsx(Truncate, { content: name }) })), role === 'bot' && (_jsx(Label, { variant: "outline", isCompact: true, children: botWord })), _jsx(Timestamp, { date: date, children: timestamp })] }), _jsxs("div", { className: "pf-chatbot__message-response", children: [_jsxs("div", { className: "pf-chatbot__message-and-actions", children: [renderMessage(), afterMainContent && _jsx(_Fragment, { children: afterMainContent }), toolResponse && _jsx(ToolResponse, Object.assign({}, toolResponse)), deepThinking && _jsx(DeepThinking, Object.assign({}, deepThinking)), toolCall && _jsx(ToolCall, Object.assign({}, toolCall)), !isLoading && sources && _jsx(SourcesCard, Object.assign({}, sources, { isCompact: isCompact })), quickStarts && quickStarts.quickStart && (_jsx(QuickStartTile, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel, isCompact: isCompact })), !isLoading && !isEditable && actions && (_jsx(ResponseActions, { actions: actions, persistActionSelection: persistActionSelection })), userFeedbackForm && _jsx(UserFeedback, Object.assign({}, userFeedbackForm, { timestamp: dateString, isCompact: isCompact })), userFeedbackComplete && (_jsx(UserFeedbackComplete, Object.assign({}, userFeedbackComplete, { timestamp: dateString, isCompact: isCompact }))), !isLoading && quickResponses && (_jsx(QuickResponse, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps, isCompact: isCompact }))] }), attachments && (_jsx("div", { className: "pf-chatbot__message-attachments-container", children: attachments.map((attachment) => {
|
|
216
|
+
return (_jsxs("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}`, "aria-live": isLiveRegion ? 'polite' : undefined, "aria-atomic": isLiveRegion ? false : undefined, ref: innerRef }, props, { children: [avatar && (_jsx(Avatar, Object.assign({ className: `pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`, src: avatar, alt: "" }, avatarProps))), _jsxs("div", { className: "pf-chatbot__message-contents", children: [_jsxs("div", { className: "pf-chatbot__message-meta", children: [name && (_jsx("span", { className: "pf-chatbot__message-name", children: _jsx(Truncate, { content: name }) })), role === 'bot' && (_jsx(Label, { variant: "outline", isCompact: true, children: botWord })), _jsx(Timestamp, { date: date, children: timestamp })] }), _jsxs("div", { className: "pf-chatbot__message-response", children: [_jsxs("div", { className: "pf-chatbot__message-and-actions", children: [renderMessage(), afterMainContent && _jsx(_Fragment, { children: afterMainContent }), toolResponse && _jsx(ToolResponse, Object.assign({}, toolResponse)), deepThinking && _jsx(DeepThinking, Object.assign({}, deepThinking)), toolCall && _jsx(ToolCall, Object.assign({}, toolCall)), !isLoading && sources && _jsx(SourcesCard, Object.assign({}, sources, { isCompact: isCompact })), quickStarts && quickStarts.quickStart && (_jsx(QuickStartTile, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel, isCompact: isCompact })), !isLoading && !isEditable && actions && (_jsx(_Fragment, { children: Array.isArray(actions) ? (_jsx("div", { className: "pf-chatbot__response-actions-groups", children: actions.map((actionGroup, index) => (_jsx(ResponseActions, { actions: actionGroup.actions || actionGroup, persistActionSelection: persistActionSelection || actionGroup.persistActionSelection }, index))) })) : (_jsx(ResponseActions, { actions: actions, persistActionSelection: persistActionSelection })) })), userFeedbackForm && _jsx(UserFeedback, Object.assign({}, userFeedbackForm, { timestamp: dateString, isCompact: isCompact })), userFeedbackComplete && (_jsx(UserFeedbackComplete, Object.assign({}, userFeedbackComplete, { timestamp: dateString, isCompact: isCompact }))), !isLoading && quickResponses && (_jsx(QuickResponse, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps, isCompact: isCompact }))] }), attachments && (_jsx("div", { className: "pf-chatbot__message-attachments-container", children: attachments.map((attachment) => {
|
|
217
217
|
var _a;
|
|
218
218
|
return (_jsx("div", { className: "pf-chatbot__message-attachment", children: _jsx(FileDetailsLabel, { fileName: attachment.name, fileId: attachment.id, onClose: attachment.onClose, onClick: attachment.onClick, isLoading: attachment.isLoading, closeButtonAriaLabel: attachment.closeButtonAriaLabel, languageTestId: attachment.languageTestId, spinnerTestId: attachment.spinnerTestId, variant: isPrimary ? 'outline' : undefined }) }, (_a = attachment.id) !== null && _a !== void 0 ? _a : attachment.name));
|
|
219
219
|
}) })), !isLoading && endContent && _jsx(_Fragment, { children: endContent })] })] })] })));
|
|
@@ -355,7 +355,7 @@ describe('Message', () => {
|
|
|
355
355
|
expect(screen.queryByRole('button', { name: /No/i })).toBeFalsy();
|
|
356
356
|
expect(screen.getByRole('button', { name: /1 more/i }));
|
|
357
357
|
}));
|
|
358
|
-
it('
|
|
358
|
+
it('Renders response actions when a single actions object is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
359
359
|
render(_jsx(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", actions: {
|
|
360
360
|
// eslint-disable-next-line no-console
|
|
361
361
|
positive: { onClick: () => console.log('Good response') },
|
|
@@ -373,9 +373,132 @@ describe('Message', () => {
|
|
|
373
373
|
listen: { onClick: () => console.log('Listen') }
|
|
374
374
|
} }));
|
|
375
375
|
ALL_ACTIONS.forEach(({ label }) => {
|
|
376
|
-
expect(screen.getByRole('button', { name: label })).
|
|
376
|
+
expect(screen.getByRole('button', { name: label })).toBeVisible();
|
|
377
377
|
});
|
|
378
378
|
}));
|
|
379
|
+
it('Renders response actions when an array of actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
380
|
+
render(_jsx(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", actions: [
|
|
381
|
+
{
|
|
382
|
+
// eslint-disable-next-line no-console
|
|
383
|
+
positive: { onClick: () => console.log('Good response') },
|
|
384
|
+
// eslint-disable-next-line no-console
|
|
385
|
+
negative: { onClick: () => console.log('Bad response') }
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
// eslint-disable-next-line no-console
|
|
389
|
+
copy: { onClick: () => console.log('Copy') },
|
|
390
|
+
// eslint-disable-next-line no-console
|
|
391
|
+
edit: { onClick: () => console.log('Edit') },
|
|
392
|
+
// eslint-disable-next-line no-console
|
|
393
|
+
share: { onClick: () => console.log('Share') },
|
|
394
|
+
// eslint-disable-next-line no-console
|
|
395
|
+
download: { onClick: () => console.log('Download') }
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
// eslint-disable-next-line no-console
|
|
399
|
+
listen: { onClick: () => console.log('Listen') }
|
|
400
|
+
}
|
|
401
|
+
] }));
|
|
402
|
+
ALL_ACTIONS.forEach(({ label }) => {
|
|
403
|
+
expect(screen.getByRole('button', { name: label })).toBeVisible();
|
|
404
|
+
});
|
|
405
|
+
}));
|
|
406
|
+
it('Renders response actions when an array of objects containing actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
407
|
+
render(_jsx(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", actions: [
|
|
408
|
+
{
|
|
409
|
+
actions: {
|
|
410
|
+
// eslint-disable-next-line no-console
|
|
411
|
+
positive: { onClick: () => console.log('Good response') },
|
|
412
|
+
// eslint-disable-next-line no-console
|
|
413
|
+
negative: { onClick: () => console.log('Bad response') }
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
actions: {
|
|
418
|
+
// eslint-disable-next-line no-console
|
|
419
|
+
copy: { onClick: () => console.log('Copy') },
|
|
420
|
+
// eslint-disable-next-line no-console
|
|
421
|
+
edit: { onClick: () => console.log('Edit') },
|
|
422
|
+
// eslint-disable-next-line no-console
|
|
423
|
+
share: { onClick: () => console.log('Share') },
|
|
424
|
+
// eslint-disable-next-line no-console
|
|
425
|
+
download: { onClick: () => console.log('Download') }
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
actions: {
|
|
430
|
+
// eslint-disable-next-line no-console
|
|
431
|
+
listen: { onClick: () => console.log('Listen') }
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
] }));
|
|
435
|
+
ALL_ACTIONS.forEach(({ label }) => {
|
|
436
|
+
expect(screen.getByRole('button', { name: label })).toBeVisible();
|
|
437
|
+
});
|
|
438
|
+
}));
|
|
439
|
+
it('should handle persistActionSelection correctly when a single actions object is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
440
|
+
render(_jsx(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Test message", persistActionSelection: true, actions: {
|
|
441
|
+
positive: { onClick: jest.fn() },
|
|
442
|
+
negative: { onClick: jest.fn() }
|
|
443
|
+
} }));
|
|
444
|
+
const goodBtn = screen.getByRole('button', { name: /Good response/i });
|
|
445
|
+
const badBtn = screen.getByRole('button', { name: /Bad response/i });
|
|
446
|
+
yield userEvent.click(goodBtn);
|
|
447
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
448
|
+
yield userEvent.click(screen.getByText('Test message'));
|
|
449
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
450
|
+
yield userEvent.click(badBtn);
|
|
451
|
+
expect(screen.getByRole('button', { name: /Bad response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
452
|
+
expect(goodBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
453
|
+
}));
|
|
454
|
+
it('should handle persistActionSelection correctly when an array of actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
455
|
+
render(_jsx(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Test message", persistActionSelection: true, actions: [
|
|
456
|
+
{
|
|
457
|
+
positive: { onClick: jest.fn() },
|
|
458
|
+
negative: { onClick: jest.fn() }
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
copy: { onClick: jest.fn() }
|
|
462
|
+
}
|
|
463
|
+
] }));
|
|
464
|
+
const goodBtn = screen.getByRole('button', { name: /Good response/i });
|
|
465
|
+
const copyBtn = screen.getByRole('button', { name: /Copy/i });
|
|
466
|
+
yield userEvent.click(goodBtn);
|
|
467
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
468
|
+
yield userEvent.click(screen.getByText('Test message'));
|
|
469
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
470
|
+
yield userEvent.click(copyBtn);
|
|
471
|
+
expect(screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
472
|
+
yield userEvent.click(screen.getByText('Test message'));
|
|
473
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
474
|
+
expect(screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
475
|
+
}));
|
|
476
|
+
it('should handle persistActionSelection correctly when an array of objects containing actions objects is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
477
|
+
render(_jsx(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Test message", actions: [
|
|
478
|
+
{
|
|
479
|
+
actions: {
|
|
480
|
+
positive: { onClick: jest.fn() },
|
|
481
|
+
negative: { onClick: jest.fn() }
|
|
482
|
+
},
|
|
483
|
+
persistActionSelection: true
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
actions: {
|
|
487
|
+
copy: { onClick: jest.fn() }
|
|
488
|
+
},
|
|
489
|
+
persistActionSelection: false
|
|
490
|
+
}
|
|
491
|
+
] }));
|
|
492
|
+
const goodBtn = screen.getByRole('button', { name: /Good response/i });
|
|
493
|
+
const copyBtn = screen.getByRole('button', { name: /Copy/i });
|
|
494
|
+
yield userEvent.click(goodBtn);
|
|
495
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
496
|
+
yield userEvent.click(copyBtn);
|
|
497
|
+
expect(screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
498
|
+
yield userEvent.click(screen.getByText('Test message'));
|
|
499
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
500
|
+
expect(copyBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
501
|
+
}));
|
|
379
502
|
it('should not show actions if loading', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
380
503
|
render(_jsx(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", isLoading: true, actions: {
|
|
381
504
|
// eslint-disable-next-line no-console
|
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.21",
|
|
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",
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { FunctionComponent } from 'react';
|
|
2
|
+
|
|
3
|
+
import Message from '@patternfly/chatbot/dist/dynamic/Message';
|
|
4
|
+
import patternflyAvatar from './patternfly_avatar.jpg';
|
|
5
|
+
|
|
6
|
+
export const MessageWithMultipleActionGroups: FunctionComponent = () => (
|
|
7
|
+
<>
|
|
8
|
+
<Message
|
|
9
|
+
name="Bot"
|
|
10
|
+
role="bot"
|
|
11
|
+
avatar={patternflyAvatar}
|
|
12
|
+
content="This message contains multiple action groups, each with their own selection persistence: \n1. Feedback actions (thumbs up/down) with persistent selections \n2. Utility actions (copy, download) with non-persistent selections \n3. Listen action with persistent selection"
|
|
13
|
+
actions={[
|
|
14
|
+
{
|
|
15
|
+
actions: {
|
|
16
|
+
// eslint-disable-next-line no-console
|
|
17
|
+
positive: { onClick: () => console.log('Good response') },
|
|
18
|
+
// eslint-disable-next-line no-console
|
|
19
|
+
negative: { onClick: () => console.log('Bad response') }
|
|
20
|
+
},
|
|
21
|
+
persistActionSelection: true
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
actions: {
|
|
25
|
+
// eslint-disable-next-line no-console
|
|
26
|
+
copy: { onClick: () => console.log('Copy') },
|
|
27
|
+
// eslint-disable-next-line no-console
|
|
28
|
+
download: { onClick: () => console.log('Download') }
|
|
29
|
+
},
|
|
30
|
+
persistActionSelection: false
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
actions: {
|
|
34
|
+
// eslint-disable-next-line no-console
|
|
35
|
+
listen: { onClick: () => console.log('Listen') }
|
|
36
|
+
},
|
|
37
|
+
persistActionSelection: true
|
|
38
|
+
}
|
|
39
|
+
]}
|
|
40
|
+
/>
|
|
41
|
+
<Message
|
|
42
|
+
name="Bot"
|
|
43
|
+
role="bot"
|
|
44
|
+
avatar={patternflyAvatar}
|
|
45
|
+
content="This message contains multiple action groups, both of which persist selections."
|
|
46
|
+
actions={[
|
|
47
|
+
{
|
|
48
|
+
// eslint-disable-next-line no-console
|
|
49
|
+
positive: { onClick: () => console.log('Good response') },
|
|
50
|
+
// eslint-disable-next-line no-console
|
|
51
|
+
negative: { onClick: () => console.log('Bad response') }
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
// eslint-disable-next-line no-console
|
|
55
|
+
listen: { onClick: () => console.log('Listen') }
|
|
56
|
+
}
|
|
57
|
+
]}
|
|
58
|
+
persistActionSelection={true}
|
|
59
|
+
/>
|
|
60
|
+
</>
|
|
61
|
+
);
|
|
@@ -122,6 +122,24 @@ When `persistActionSelection` is `true`:
|
|
|
122
122
|
|
|
123
123
|
```
|
|
124
124
|
|
|
125
|
+
### Multiple messsage action groups
|
|
126
|
+
|
|
127
|
+
To maintain finer control over message action selection behavior, you can create groups of actions by passing an array of objects to the `actions` prop. This allows you to separate actions into conceptually or functionally different groups and implement different behavior for each group as needed. For example, you could separate feedback actions (thumbs up/down) form utility actions (copy and download), and have different selection behaviors for each group.
|
|
128
|
+
|
|
129
|
+
To provide flexibility for your use case, there are 2 approaches you can take to pass an array of objects to `actions`:
|
|
130
|
+
|
|
131
|
+
1. Pass an array of objects, where each object contains:
|
|
132
|
+
|
|
133
|
+
- `actions`: An `action` object containing the actions for that group (the same format as a single `action` object)
|
|
134
|
+
|
|
135
|
+
- `persistActionSelection` (optional): A boolean to control whether selections persists for this specific group
|
|
136
|
+
|
|
137
|
+
2. Pass an array of `action` objects (the same format as a single `action` object) and (optionally) a value for the `persistActionSelection` property that will apply to all groups.
|
|
138
|
+
|
|
139
|
+
```js file="./MessageWithMultipleActionGroups.tsx"
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
|
|
125
143
|
### Custom message actions
|
|
126
144
|
|
|
127
145
|
Beyond the standard message actions (good response, bad response, copy, share, or listen), you can add custom actions to a bot message by passing an `actions` object to the `<Message>` component. This object can contain the following customizations:
|
|
@@ -437,7 +437,7 @@ describe('Message', () => {
|
|
|
437
437
|
expect(screen.queryByRole('button', { name: /No/i })).toBeFalsy();
|
|
438
438
|
expect(screen.getByRole('button', { name: /1 more/i }));
|
|
439
439
|
});
|
|
440
|
-
it('
|
|
440
|
+
it('Renders response actions when a single actions object is passed', async () => {
|
|
441
441
|
render(
|
|
442
442
|
<Message
|
|
443
443
|
avatar="./img"
|
|
@@ -463,9 +463,204 @@ describe('Message', () => {
|
|
|
463
463
|
/>
|
|
464
464
|
);
|
|
465
465
|
ALL_ACTIONS.forEach(({ label }) => {
|
|
466
|
-
expect(screen.getByRole('button', { name: label })).
|
|
466
|
+
expect(screen.getByRole('button', { name: label })).toBeVisible();
|
|
467
467
|
});
|
|
468
468
|
});
|
|
469
|
+
it('Renders response actions when an array of actions objects is passed', async () => {
|
|
470
|
+
render(
|
|
471
|
+
<Message
|
|
472
|
+
avatar="./img"
|
|
473
|
+
role="bot"
|
|
474
|
+
name="Bot"
|
|
475
|
+
content="Hi"
|
|
476
|
+
actions={[
|
|
477
|
+
{
|
|
478
|
+
// eslint-disable-next-line no-console
|
|
479
|
+
positive: { onClick: () => console.log('Good response') },
|
|
480
|
+
// eslint-disable-next-line no-console
|
|
481
|
+
negative: { onClick: () => console.log('Bad response') }
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
// eslint-disable-next-line no-console
|
|
485
|
+
copy: { onClick: () => console.log('Copy') },
|
|
486
|
+
// eslint-disable-next-line no-console
|
|
487
|
+
edit: { onClick: () => console.log('Edit') },
|
|
488
|
+
// eslint-disable-next-line no-console
|
|
489
|
+
share: { onClick: () => console.log('Share') },
|
|
490
|
+
// eslint-disable-next-line no-console
|
|
491
|
+
download: { onClick: () => console.log('Download') }
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
// eslint-disable-next-line no-console
|
|
495
|
+
listen: { onClick: () => console.log('Listen') }
|
|
496
|
+
}
|
|
497
|
+
]}
|
|
498
|
+
/>
|
|
499
|
+
);
|
|
500
|
+
ALL_ACTIONS.forEach(({ label }) => {
|
|
501
|
+
expect(screen.getByRole('button', { name: label })).toBeVisible();
|
|
502
|
+
});
|
|
503
|
+
});
|
|
504
|
+
it('Renders response actions when an array of objects containing actions objects is passed', async () => {
|
|
505
|
+
render(
|
|
506
|
+
<Message
|
|
507
|
+
avatar="./img"
|
|
508
|
+
role="bot"
|
|
509
|
+
name="Bot"
|
|
510
|
+
content="Hi"
|
|
511
|
+
actions={[
|
|
512
|
+
{
|
|
513
|
+
actions: {
|
|
514
|
+
// eslint-disable-next-line no-console
|
|
515
|
+
positive: { onClick: () => console.log('Good response') },
|
|
516
|
+
// eslint-disable-next-line no-console
|
|
517
|
+
negative: { onClick: () => console.log('Bad response') }
|
|
518
|
+
}
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
actions: {
|
|
522
|
+
// eslint-disable-next-line no-console
|
|
523
|
+
copy: { onClick: () => console.log('Copy') },
|
|
524
|
+
// eslint-disable-next-line no-console
|
|
525
|
+
edit: { onClick: () => console.log('Edit') },
|
|
526
|
+
// eslint-disable-next-line no-console
|
|
527
|
+
share: { onClick: () => console.log('Share') },
|
|
528
|
+
// eslint-disable-next-line no-console
|
|
529
|
+
download: { onClick: () => console.log('Download') }
|
|
530
|
+
}
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
actions: {
|
|
534
|
+
// eslint-disable-next-line no-console
|
|
535
|
+
listen: { onClick: () => console.log('Listen') }
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
]}
|
|
539
|
+
/>
|
|
540
|
+
);
|
|
541
|
+
ALL_ACTIONS.forEach(({ label }) => {
|
|
542
|
+
expect(screen.getByRole('button', { name: label })).toBeVisible();
|
|
543
|
+
});
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
it('should handle persistActionSelection correctly when a single actions object is passed', async () => {
|
|
547
|
+
render(
|
|
548
|
+
<Message
|
|
549
|
+
avatar="./img"
|
|
550
|
+
role="bot"
|
|
551
|
+
name="Bot"
|
|
552
|
+
content="Test message"
|
|
553
|
+
persistActionSelection
|
|
554
|
+
actions={{
|
|
555
|
+
positive: { onClick: jest.fn() },
|
|
556
|
+
negative: { onClick: jest.fn() }
|
|
557
|
+
}}
|
|
558
|
+
/>
|
|
559
|
+
);
|
|
560
|
+
const goodBtn = screen.getByRole('button', { name: /Good response/i });
|
|
561
|
+
const badBtn = screen.getByRole('button', { name: /Bad response/i });
|
|
562
|
+
|
|
563
|
+
await userEvent.click(goodBtn);
|
|
564
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass(
|
|
565
|
+
'pf-chatbot__button--response-action-clicked'
|
|
566
|
+
);
|
|
567
|
+
|
|
568
|
+
await userEvent.click(screen.getByText('Test message'));
|
|
569
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass(
|
|
570
|
+
'pf-chatbot__button--response-action-clicked'
|
|
571
|
+
);
|
|
572
|
+
|
|
573
|
+
await userEvent.click(badBtn);
|
|
574
|
+
expect(screen.getByRole('button', { name: /Bad response recorded/i })).toHaveClass(
|
|
575
|
+
'pf-chatbot__button--response-action-clicked'
|
|
576
|
+
);
|
|
577
|
+
expect(goodBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
it('should handle persistActionSelection correctly when an array of actions objects is passed', async () => {
|
|
581
|
+
render(
|
|
582
|
+
<Message
|
|
583
|
+
avatar="./img"
|
|
584
|
+
role="bot"
|
|
585
|
+
name="Bot"
|
|
586
|
+
content="Test message"
|
|
587
|
+
persistActionSelection
|
|
588
|
+
actions={[
|
|
589
|
+
{
|
|
590
|
+
positive: { onClick: jest.fn() },
|
|
591
|
+
negative: { onClick: jest.fn() }
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
copy: { onClick: jest.fn() }
|
|
595
|
+
}
|
|
596
|
+
]}
|
|
597
|
+
/>
|
|
598
|
+
);
|
|
599
|
+
const goodBtn = screen.getByRole('button', { name: /Good response/i });
|
|
600
|
+
const copyBtn = screen.getByRole('button', { name: /Copy/i });
|
|
601
|
+
|
|
602
|
+
await userEvent.click(goodBtn);
|
|
603
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass(
|
|
604
|
+
'pf-chatbot__button--response-action-clicked'
|
|
605
|
+
);
|
|
606
|
+
|
|
607
|
+
await userEvent.click(screen.getByText('Test message'));
|
|
608
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass(
|
|
609
|
+
'pf-chatbot__button--response-action-clicked'
|
|
610
|
+
);
|
|
611
|
+
|
|
612
|
+
await userEvent.click(copyBtn);
|
|
613
|
+
expect(screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
614
|
+
|
|
615
|
+
await userEvent.click(screen.getByText('Test message'));
|
|
616
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass(
|
|
617
|
+
'pf-chatbot__button--response-action-clicked'
|
|
618
|
+
);
|
|
619
|
+
expect(screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
it('should handle persistActionSelection correctly when an array of objects containing actions objects is passed', async () => {
|
|
623
|
+
render(
|
|
624
|
+
<Message
|
|
625
|
+
avatar="./img"
|
|
626
|
+
role="bot"
|
|
627
|
+
name="Bot"
|
|
628
|
+
content="Test message"
|
|
629
|
+
actions={[
|
|
630
|
+
{
|
|
631
|
+
actions: {
|
|
632
|
+
positive: { onClick: jest.fn() },
|
|
633
|
+
negative: { onClick: jest.fn() }
|
|
634
|
+
},
|
|
635
|
+
persistActionSelection: true
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
actions: {
|
|
639
|
+
copy: { onClick: jest.fn() }
|
|
640
|
+
},
|
|
641
|
+
persistActionSelection: false
|
|
642
|
+
}
|
|
643
|
+
]}
|
|
644
|
+
/>
|
|
645
|
+
);
|
|
646
|
+
const goodBtn = screen.getByRole('button', { name: /Good response/i });
|
|
647
|
+
const copyBtn = screen.getByRole('button', { name: /Copy/i });
|
|
648
|
+
|
|
649
|
+
await userEvent.click(goodBtn);
|
|
650
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass(
|
|
651
|
+
'pf-chatbot__button--response-action-clicked'
|
|
652
|
+
);
|
|
653
|
+
|
|
654
|
+
await userEvent.click(copyBtn);
|
|
655
|
+
expect(screen.getByRole('button', { name: /Copied/i })).toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
656
|
+
|
|
657
|
+
await userEvent.click(screen.getByText('Test message'));
|
|
658
|
+
expect(screen.getByRole('button', { name: /Good response recorded/i })).toHaveClass(
|
|
659
|
+
'pf-chatbot__button--response-action-clicked'
|
|
660
|
+
);
|
|
661
|
+
expect(copyBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
|
|
662
|
+
});
|
|
663
|
+
|
|
469
664
|
it('should not show actions if loading', async () => {
|
|
470
665
|
render(
|
|
471
666
|
<Message
|
|
@@ -527,6 +722,7 @@ describe('Message', () => {
|
|
|
527
722
|
expect(screen.queryByRole('button', { name: label })).toBeFalsy();
|
|
528
723
|
});
|
|
529
724
|
});
|
|
725
|
+
|
|
530
726
|
it('should render unordered lists correctly', () => {
|
|
531
727
|
render(<Message avatar="./img" role="user" name="User" content={UNORDERED_LIST} />);
|
|
532
728
|
expect(screen.getByText('Here is an unordered list:')).toBeTruthy();
|
package/src/Message/Message.tsx
CHANGED
|
@@ -104,12 +104,27 @@ export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
|
|
|
104
104
|
isLoading?: boolean;
|
|
105
105
|
/** Array of attachments attached to a message */
|
|
106
106
|
attachments?: MessageAttachment[];
|
|
107
|
-
/** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
107
|
+
/** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen.
|
|
108
|
+
* Can be a single actions object or an array of action group objects. When passing an array, you can pass an object of actions or
|
|
109
|
+
* an object that contains an actions property for finer control of selection persistence.
|
|
110
|
+
*/
|
|
111
|
+
actions?:
|
|
112
|
+
| {
|
|
113
|
+
[key: string]: ActionProps;
|
|
114
|
+
}
|
|
115
|
+
| {
|
|
116
|
+
[key: string]: ActionProps;
|
|
117
|
+
}[]
|
|
118
|
+
| {
|
|
119
|
+
actions: {
|
|
120
|
+
[key: string]: ActionProps;
|
|
121
|
+
};
|
|
122
|
+
persistActionSelection?: boolean;
|
|
123
|
+
}[];
|
|
111
124
|
/** When true, the selected action will persist even when clicking outside the component.
|
|
112
|
-
* When false (default), clicking outside or clicking another action will deselect the current selection.
|
|
125
|
+
* When false (default), clicking outside or clicking another action will deselect the current selection.
|
|
126
|
+
* For finer control of multiple action groups, use persistActionSelection on each group.
|
|
127
|
+
*/
|
|
113
128
|
persistActionSelection?: boolean;
|
|
114
129
|
/** Sources for message */
|
|
115
130
|
sources?: SourcesCardProps;
|
|
@@ -506,7 +521,21 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
|
|
|
506
521
|
/>
|
|
507
522
|
)}
|
|
508
523
|
{!isLoading && !isEditable && actions && (
|
|
509
|
-
|
|
524
|
+
<>
|
|
525
|
+
{Array.isArray(actions) ? (
|
|
526
|
+
<div className="pf-chatbot__response-actions-groups">
|
|
527
|
+
{actions.map((actionGroup, index) => (
|
|
528
|
+
<ResponseActions
|
|
529
|
+
key={index}
|
|
530
|
+
actions={actionGroup.actions || actionGroup}
|
|
531
|
+
persistActionSelection={persistActionSelection || actionGroup.persistActionSelection}
|
|
532
|
+
/>
|
|
533
|
+
))}
|
|
534
|
+
</div>
|
|
535
|
+
) : (
|
|
536
|
+
<ResponseActions actions={actions} persistActionSelection={persistActionSelection} />
|
|
537
|
+
)}
|
|
538
|
+
</>
|
|
510
539
|
)}
|
|
511
540
|
{userFeedbackForm && <UserFeedback {...userFeedbackForm} timestamp={dateString} isCompact={isCompact} />}
|
|
512
541
|
{userFeedbackComplete && (
|
|
@@ -22,6 +22,17 @@
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
.pf-chatbot__response-actions-groups {
|
|
26
|
+
display: grid;
|
|
27
|
+
grid-auto-flow: column;
|
|
28
|
+
grid-auto-columns: max-content;
|
|
29
|
+
gap: var(--pf-t--global--spacer--xs);
|
|
30
|
+
|
|
31
|
+
.pf-chatbot__response-actions {
|
|
32
|
+
display: flex;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
25
36
|
.pf-v6-c-button.pf-chatbot__button--response-action-clicked.pf-v6-c-button.pf-m-plain.pf-m-small {
|
|
26
37
|
--pf-v6-c-button--m-plain--BackgroundColor: var(--pf-t--global--background--color--action--plain--alt--clicked);
|
|
27
38
|
--pf-v6-c-button__icon--Color: var(--pf-t--global--icon--color--regular);
|