@patternfly/chatbot 6.4.0-prerelease.2 → 6.4.0-prerelease.20
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/Chatbot/Chatbot.js +1 -7
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +2 -0
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +2 -2
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +22 -2
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +15 -9
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +40 -2
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderNewChatButton.d.ts +18 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderNewChatButton.js +25 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderNewChatButton.test.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderNewChatButton.test.js +22 -0
- package/dist/cjs/ChatbotHeader/index.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/index.js +1 -0
- package/dist/cjs/DeepThinking/DeepThinking.d.ts +18 -0
- package/dist/cjs/DeepThinking/DeepThinking.js +18 -0
- package/dist/cjs/DeepThinking/DeepThinking.test.d.ts +1 -0
- package/dist/cjs/DeepThinking/DeepThinking.test.js +48 -0
- package/dist/cjs/DeepThinking/index.d.ts +2 -0
- package/dist/cjs/DeepThinking/index.js +23 -0
- package/dist/cjs/FilePreview/FilePreview.d.ts +26 -0
- package/dist/cjs/FilePreview/FilePreview.js +26 -0
- package/dist/cjs/FilePreview/FilePreview.test.d.ts +1 -0
- package/dist/cjs/FilePreview/FilePreview.test.js +97 -0
- package/dist/cjs/FilePreview/index.d.ts +2 -0
- package/dist/cjs/FilePreview/index.js +23 -0
- package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.js +3 -3
- package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +2 -1
- package/dist/cjs/Message/LinkMessage/LinkMessage.js +7 -3
- package/dist/cjs/Message/ListMessage/ListItemMessage.d.ts +1 -1
- package/dist/cjs/Message/ListMessage/ListItemMessage.js +16 -1
- package/dist/cjs/Message/Message.d.ts +15 -0
- package/dist/cjs/Message/Message.js +129 -32
- package/dist/cjs/Message/Message.test.js +71 -0
- package/dist/cjs/Message/SuperscriptMessage/SuperscriptMessage.d.ts +3 -0
- package/dist/cjs/Message/SuperscriptMessage/SuperscriptMessage.js +5 -0
- package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +15 -1
- package/dist/cjs/Message/UserFeedback/UserFeedback.js +4 -4
- package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +44 -0
- package/dist/cjs/MessageBar/MessageBar.js +19 -4
- package/dist/cjs/MessageBox/JumpButton.d.ts +5 -0
- package/dist/cjs/MessageBox/JumpButton.js +1 -1
- package/dist/cjs/MessageBox/JumpButton.test.js +4 -4
- package/dist/cjs/MessageBox/MessageBox.d.ts +9 -0
- package/dist/cjs/MessageBox/MessageBox.js +2 -2
- package/dist/cjs/MessageBox/MessageBox.test.js +2 -2
- package/dist/cjs/SourcesCard/SourcesCard.d.ts +13 -1
- package/dist/cjs/SourcesCard/SourcesCard.js +6 -6
- package/dist/cjs/SourcesCard/SourcesCard.test.js +49 -0
- package/dist/cjs/ToolResponse/ToolResponse.d.ts +30 -0
- package/dist/cjs/ToolResponse/ToolResponse.js +18 -0
- package/dist/cjs/ToolResponse/ToolResponse.test.d.ts +1 -0
- package/dist/cjs/ToolResponse/ToolResponse.test.js +60 -0
- package/dist/cjs/ToolResponse/index.d.ts +2 -0
- package/dist/cjs/ToolResponse/index.js +23 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.js +10 -1
- package/dist/css/main.css +273 -17
- package/dist/css/main.css.map +1 -1
- package/dist/dynamic/DeepThinking/package.json +1 -0
- package/dist/dynamic/FilePreview/package.json +1 -0
- package/dist/dynamic/ToolResponse/package.json +1 -0
- package/dist/esm/Chatbot/Chatbot.js +1 -7
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +2 -0
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +2 -2
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +22 -2
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +17 -11
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +41 -3
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderNewChatButton.d.ts +18 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderNewChatButton.js +22 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderNewChatButton.test.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderNewChatButton.test.js +20 -0
- package/dist/esm/ChatbotHeader/index.d.ts +1 -0
- package/dist/esm/ChatbotHeader/index.js +1 -0
- package/dist/esm/DeepThinking/DeepThinking.d.ts +18 -0
- package/dist/esm/DeepThinking/DeepThinking.js +14 -0
- package/dist/esm/DeepThinking/DeepThinking.test.d.ts +1 -0
- package/dist/esm/DeepThinking/DeepThinking.test.js +43 -0
- package/dist/esm/DeepThinking/index.d.ts +2 -0
- package/dist/esm/DeepThinking/index.js +2 -0
- package/dist/esm/FilePreview/FilePreview.d.ts +26 -0
- package/dist/esm/FilePreview/FilePreview.js +21 -0
- package/dist/esm/FilePreview/FilePreview.test.d.ts +1 -0
- package/dist/esm/FilePreview/FilePreview.test.js +92 -0
- package/dist/esm/FilePreview/index.d.ts +2 -0
- package/dist/esm/FilePreview/index.js +2 -0
- package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.js +5 -5
- package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +2 -1
- package/dist/esm/Message/LinkMessage/LinkMessage.js +7 -3
- package/dist/esm/Message/ListMessage/ListItemMessage.d.ts +1 -1
- package/dist/esm/Message/ListMessage/ListItemMessage.js +16 -1
- package/dist/esm/Message/Message.d.ts +15 -0
- package/dist/esm/Message/Message.js +129 -32
- package/dist/esm/Message/Message.test.js +71 -0
- package/dist/esm/Message/SuperscriptMessage/SuperscriptMessage.d.ts +3 -0
- package/dist/esm/Message/SuperscriptMessage/SuperscriptMessage.js +3 -0
- package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +15 -1
- package/dist/esm/Message/UserFeedback/UserFeedback.js +4 -4
- package/dist/esm/Message/UserFeedback/UserFeedback.test.js +45 -1
- package/dist/esm/MessageBar/MessageBar.js +19 -4
- package/dist/esm/MessageBox/JumpButton.d.ts +5 -0
- package/dist/esm/MessageBox/JumpButton.js +1 -1
- package/dist/esm/MessageBox/JumpButton.test.js +4 -4
- package/dist/esm/MessageBox/MessageBox.d.ts +9 -0
- package/dist/esm/MessageBox/MessageBox.js +2 -2
- package/dist/esm/MessageBox/MessageBox.test.js +2 -2
- package/dist/esm/SourcesCard/SourcesCard.d.ts +13 -1
- package/dist/esm/SourcesCard/SourcesCard.js +6 -6
- package/dist/esm/SourcesCard/SourcesCard.test.js +50 -1
- package/dist/esm/ToolResponse/ToolResponse.d.ts +30 -0
- package/dist/esm/ToolResponse/ToolResponse.js +14 -0
- package/dist/esm/ToolResponse/ToolResponse.test.d.ts +1 -0
- package/dist/esm/ToolResponse/ToolResponse.test.js +55 -0
- package/dist/esm/ToolResponse/index.d.ts +2 -0
- package/dist/esm/ToolResponse/index.js +2 -0
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.js +6 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +101 -3
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/FilePreview.tsx +33 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithDeepThinking.tsx +17 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +111 -85
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +70 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolResponse.tsx +135 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +28 -4
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +107 -2
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +616 -3
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotConversationEditing.tsx +202 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderBasic.tsx +17 -3
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +36 -5
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithPin.tsx +12 -2
- package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +22 -3
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +1 -1
- package/patternfly-docs/patternfly-docs.config.js +1 -1
- package/src/Chatbot/Chatbot.scss +9 -2
- package/src/Chatbot/Chatbot.tsx +18 -31
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx +5 -1
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +28 -10
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +132 -3
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +80 -33
- package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +1 -1
- package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +2 -2
- package/src/ChatbotHeader/ChatbotHeaderNewChatButton.test.tsx +25 -0
- package/src/ChatbotHeader/ChatbotHeaderNewChatButton.tsx +64 -0
- package/src/ChatbotHeader/index.ts +1 -0
- package/src/ChatbotModal/ChatbotModal.scss +1 -1
- package/src/DeepThinking/DeepThinking.scss +24 -0
- package/src/DeepThinking/DeepThinking.test.tsx +61 -0
- package/src/DeepThinking/DeepThinking.tsx +68 -0
- package/src/DeepThinking/index.ts +3 -0
- package/src/FileDetails/__snapshots__/FileDetails.test.tsx.snap +6 -9
- package/src/FileDetailsLabel/__snapshots__/FileDetailsLabel.test.tsx.snap +6 -9
- package/src/FilePreview/FilePreview.scss +22 -0
- package/src/FilePreview/FilePreview.test.tsx +112 -0
- package/src/FilePreview/FilePreview.tsx +58 -0
- package/src/FilePreview/index.ts +3 -0
- package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +2 -1
- package/src/Message/CodeBlockMessage/CodeBlockMessage.tsx +6 -5
- package/src/Message/LinkMessage/LinkMessage.tsx +6 -2
- package/src/Message/ListMessage/ListItemMessage.tsx +5 -1
- package/src/Message/ListMessage/ListMessage.scss +17 -0
- package/src/Message/Message.scss +44 -0
- package/src/Message/Message.test.tsx +90 -0
- package/src/Message/Message.tsx +171 -46
- package/src/Message/SuperscriptMessage/SuperscriptMessage.scss +8 -0
- package/src/Message/SuperscriptMessage/SuperscriptMessage.tsx +13 -0
- package/src/Message/TextMessage/TextMessage.scss +46 -5
- package/src/Message/UserFeedback/UserFeedback.test.tsx +107 -0
- package/src/Message/UserFeedback/UserFeedback.tsx +41 -6
- package/src/MessageBar/MessageBar.tsx +23 -3
- package/src/MessageBox/JumpButton.test.tsx +4 -4
- package/src/MessageBox/JumpButton.tsx +20 -4
- package/src/MessageBox/MessageBox.test.tsx +2 -2
- package/src/MessageBox/MessageBox.tsx +22 -1
- package/src/SourcesCard/SourcesCard.scss +17 -0
- package/src/SourcesCard/SourcesCard.test.tsx +93 -0
- package/src/SourcesCard/SourcesCard.tsx +116 -80
- package/src/ToolResponse/ToolResponse.scss +36 -0
- package/src/ToolResponse/ToolResponse.test.tsx +78 -0
- package/src/ToolResponse/ToolResponse.tsx +95 -0
- package/src/ToolResponse/index.ts +3 -0
- package/src/index.ts +9 -0
- package/src/main.scss +3 -0
|
@@ -16,7 +16,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
16
16
|
import { useState, useRef, useCallback, useEffect, forwardRef, useImperativeHandle } from 'react';
|
|
17
17
|
import JumpButton from './JumpButton';
|
|
18
18
|
export const MessageBox = forwardRef((_a, ref) => {
|
|
19
|
-
var { announcement, ariaLabel = 'Scrollable message log', children, className, position = 'top', onScrollToTopClick, onScrollToBottomClick, enableSmartScroll = false } = _a, props = __rest(_a, ["announcement", "ariaLabel", "children", "className", "position", "onScrollToTopClick", "onScrollToBottomClick", "enableSmartScroll"]);
|
|
19
|
+
var { announcement, ariaLabel = 'Scrollable message log', children, className, position = 'top', onScrollToTopClick, onScrollToBottomClick, enableSmartScroll = false, jumpButtonTopProps, jumpButtonBottomProps, jumpButtonBottomTooltipProps, jumpButtonTopTooltipProps } = _a, props = __rest(_a, ["announcement", "ariaLabel", "children", "className", "position", "onScrollToTopClick", "onScrollToBottomClick", "enableSmartScroll", "jumpButtonTopProps", "jumpButtonBottomProps", "jumpButtonBottomTooltipProps", "jumpButtonTopTooltipProps"]);
|
|
20
20
|
const [atTop, setAtTop] = useState(false);
|
|
21
21
|
const [atBottom, setAtBottom] = useState(true);
|
|
22
22
|
const [isOverflowing, setIsOverflowing] = useState(false);
|
|
@@ -200,6 +200,6 @@ export const MessageBox = forwardRef((_a, ref) => {
|
|
|
200
200
|
onTouchMove,
|
|
201
201
|
onTouchEnd
|
|
202
202
|
};
|
|
203
|
-
return (_jsxs(_Fragment, { children: [_jsx(JumpButton, { position: "top", isHidden: isOverflowing && atTop, onClick: scrollToTop }), _jsxs("div", Object.assign({ role: "region", tabIndex: 0, "aria-label": ariaLabel, className: `pf-chatbot__messagebox ${position === 'bottom' ? 'pf-chatbot__messagebox--bottom' : ''} ${className !== null && className !== void 0 ? className : ''}`, ref: messageBoxRef }, props, (enableSmartScroll ? Object.assign({}, smartScrollHandlers) : {}), { children: [children, _jsx("div", { className: "pf-chatbot__messagebox-announcement", "aria-live": "polite", children: announcement })] })), _jsx(JumpButton, { position: "bottom", isHidden: isOverflowing && atBottom, onClick: () => scrollToBottom({ resumeSmartScroll: true }) })] }));
|
|
203
|
+
return (_jsxs(_Fragment, { children: [_jsx(JumpButton, { position: "top", isHidden: isOverflowing && atTop, onClick: scrollToTop, jumpButtonProps: jumpButtonTopProps, jumpButtonTooltipProps: jumpButtonTopTooltipProps }), _jsxs("div", Object.assign({ role: "region", tabIndex: 0, "aria-label": ariaLabel, className: `pf-chatbot__messagebox ${position === 'bottom' ? 'pf-chatbot__messagebox--bottom' : ''} ${className !== null && className !== void 0 ? className : ''}`, ref: messageBoxRef }, props, (enableSmartScroll ? Object.assign({}, smartScrollHandlers) : {}), { children: [children, _jsx("div", { className: "pf-chatbot__messagebox-announcement", "aria-live": "polite", children: announcement })] })), _jsx(JumpButton, { position: "bottom", isHidden: isOverflowing && atBottom, onClick: () => scrollToBottom({ resumeSmartScroll: true }), jumpButtonProps: jumpButtonBottomProps, jumpButtonTooltipProps: jumpButtonBottomTooltipProps })] }));
|
|
204
204
|
});
|
|
205
205
|
export default MessageBox;
|
|
@@ -51,7 +51,7 @@ describe('MessageBox', () => {
|
|
|
51
51
|
region.dispatchEvent(new Event('scroll'));
|
|
52
52
|
});
|
|
53
53
|
yield waitFor(() => {
|
|
54
|
-
userEvent.click(screen.getByRole('button', { name: /
|
|
54
|
+
userEvent.click(screen.getByRole('button', { name: /Back to bottom/i }));
|
|
55
55
|
expect(spy).toHaveBeenCalled();
|
|
56
56
|
});
|
|
57
57
|
}));
|
|
@@ -70,7 +70,7 @@ describe('MessageBox', () => {
|
|
|
70
70
|
region.dispatchEvent(new Event('scroll'));
|
|
71
71
|
});
|
|
72
72
|
yield waitFor(() => {
|
|
73
|
-
userEvent.click(screen.getByRole('button', { name: /
|
|
73
|
+
userEvent.click(screen.getByRole('button', { name: /Back to top/i }));
|
|
74
74
|
expect(spy).toHaveBeenCalled();
|
|
75
75
|
});
|
|
76
76
|
}));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FunctionComponent } from 'react';
|
|
2
|
-
import { ButtonProps, CardProps } from '@patternfly/react-core';
|
|
2
|
+
import { ButtonProps, CardBodyProps, CardFooterProps, CardProps, CardTitleProps, TruncateProps } from '@patternfly/react-core';
|
|
3
3
|
export interface SourcesCardProps extends CardProps {
|
|
4
4
|
/** Additional classes for the pagination navigation container. */
|
|
5
5
|
className?: string;
|
|
@@ -13,6 +13,8 @@ export interface SourcesCardProps extends CardProps {
|
|
|
13
13
|
sources: {
|
|
14
14
|
/** Title of sources card */
|
|
15
15
|
title?: string;
|
|
16
|
+
/** Subtitle of sources card */
|
|
17
|
+
subtitle?: string;
|
|
16
18
|
/** Link to source */
|
|
17
19
|
link: string;
|
|
18
20
|
/** Body of sources card */
|
|
@@ -25,6 +27,10 @@ export interface SourcesCardProps extends CardProps {
|
|
|
25
27
|
onClick?: React.MouseEventHandler<HTMLButtonElement>;
|
|
26
28
|
/** Any additional props applied to the title of the Sources card */
|
|
27
29
|
titleProps?: ButtonProps;
|
|
30
|
+
/** Custom footer applied to the Sources card */
|
|
31
|
+
footer?: React.ReactNode;
|
|
32
|
+
/** Additional props passed to Truncate component */
|
|
33
|
+
truncateProps?: TruncateProps;
|
|
28
34
|
}[];
|
|
29
35
|
/** Label for the English word "source" */
|
|
30
36
|
sourceWord?: string;
|
|
@@ -44,6 +50,12 @@ export interface SourcesCardProps extends CardProps {
|
|
|
44
50
|
showMoreWords?: string;
|
|
45
51
|
/** Label for English words "show less" */
|
|
46
52
|
showLessWords?: string;
|
|
53
|
+
/** Additional props passed to card title */
|
|
54
|
+
cardTitleProps?: CardTitleProps;
|
|
55
|
+
/** Additional props passed to card body */
|
|
56
|
+
cardBodyProps?: CardBodyProps;
|
|
57
|
+
/** Additional props passed to card footer */
|
|
58
|
+
cardFooterProps?: CardFooterProps;
|
|
47
59
|
}
|
|
48
60
|
declare const SourcesCard: FunctionComponent<SourcesCardProps>;
|
|
49
61
|
export default SourcesCard;
|
|
@@ -16,7 +16,7 @@ import { Button, ButtonVariant, Card, CardBody, CardFooter, CardTitle, Expandabl
|
|
|
16
16
|
import { ExternalLinkSquareAltIcon } from '@patternfly/react-icons';
|
|
17
17
|
const SourcesCard = (_a) => {
|
|
18
18
|
var _b;
|
|
19
|
-
var { className, isDisabled, paginationAriaLabel = 'Pagination', sources, sourceWord = 'source', sourceWordPlural = 'sources', toNextPageAriaLabel = 'Go to next page', toPreviousPageAriaLabel = 'Go to previous page', onNextClick, onPreviousClick, onSetPage, showMoreWords = 'show more', showLessWords = 'show less', isCompact } = _a, props = __rest(_a, ["className", "isDisabled", "paginationAriaLabel", "sources", "sourceWord", "sourceWordPlural", "toNextPageAriaLabel", "toPreviousPageAriaLabel", "onNextClick", "onPreviousClick", "onSetPage", "showMoreWords", "showLessWords", "isCompact"]);
|
|
19
|
+
var { className, isDisabled, paginationAriaLabel = 'Pagination', sources, sourceWord = 'source', sourceWordPlural = 'sources', toNextPageAriaLabel = 'Go to next page', toPreviousPageAriaLabel = 'Go to previous page', onNextClick, onPreviousClick, onSetPage, showMoreWords = 'show more', showLessWords = 'show less', isCompact, cardTitleProps, cardBodyProps, cardFooterProps } = _a, props = __rest(_a, ["className", "isDisabled", "paginationAriaLabel", "sources", "sourceWord", "sourceWordPlural", "toNextPageAriaLabel", "toPreviousPageAriaLabel", "onNextClick", "onPreviousClick", "onSetPage", "showMoreWords", "showLessWords", "isCompact", "cardTitleProps", "cardBodyProps", "cardFooterProps"]);
|
|
20
20
|
const [page, setPage] = useState(1);
|
|
21
21
|
const [isExpanded, setIsExpanded] = useState(false);
|
|
22
22
|
const onToggle = (_event, isExpanded) => {
|
|
@@ -26,15 +26,15 @@ const SourcesCard = (_a) => {
|
|
|
26
26
|
setPage(newPage);
|
|
27
27
|
onSetPage && onSetPage(_evt, newPage);
|
|
28
28
|
};
|
|
29
|
-
const renderTitle = (title) => {
|
|
29
|
+
const renderTitle = (title, truncateProps) => {
|
|
30
30
|
if (title) {
|
|
31
|
-
return _jsx(Truncate, { content: title });
|
|
31
|
+
return _jsx(Truncate, Object.assign({ content: title }, truncateProps));
|
|
32
32
|
}
|
|
33
33
|
return `Source ${page}`;
|
|
34
34
|
};
|
|
35
|
-
return (_jsxs("div", { className: "pf-chatbot__source", children: [_jsx("span", { children: pluralize(sources.length, sourceWord, sourceWordPlural) }), _jsxs(Card, Object.assign({ isCompact: isCompact, className: "pf-chatbot__sources-card" }, props, { children: [_jsx(CardTitle, { className: "pf-chatbot__sources-card-title", children: _jsx(Button, Object.assign({ component: "a", variant: ButtonVariant.link, href: sources[page - 1].link, icon: sources[page - 1].isExternal ? _jsx(ExternalLinkSquareAltIcon, {}) : undefined, iconPosition: "end", isInline: true, rel: sources[page - 1].isExternal ? 'noreferrer' : undefined, target: sources[page - 1].isExternal ? '_blank' : undefined, onClick: (_b = sources[page - 1].onClick) !== null && _b !== void 0 ? _b : undefined }, sources[page - 1].titleProps, { children: renderTitle(sources[page - 1].title) })) }), sources[page - 1].body && (_jsx(CardBody, { className: `pf-chatbot__sources-card-body
|
|
35
|
+
return (_jsxs("div", { className: "pf-chatbot__source", children: [_jsx("span", { children: pluralize(sources.length, sourceWord, sourceWordPlural) }), _jsxs(Card, Object.assign({ isCompact: isCompact, className: "pf-chatbot__sources-card" }, props, { children: [_jsx(CardTitle, Object.assign({ className: "pf-chatbot__sources-card-title" }, cardTitleProps, { children: _jsxs("div", { className: "pf-chatbot__sources-card-title-container", children: [_jsx(Button, Object.assign({ component: "a", variant: ButtonVariant.link, href: sources[page - 1].link, icon: sources[page - 1].isExternal ? _jsx(ExternalLinkSquareAltIcon, {}) : undefined, iconPosition: "end", isInline: true, rel: sources[page - 1].isExternal ? 'noreferrer' : undefined, target: sources[page - 1].isExternal ? '_blank' : undefined, onClick: (_b = sources[page - 1].onClick) !== null && _b !== void 0 ? _b : undefined }, sources[page - 1].titleProps, { children: renderTitle(sources[page - 1].title, sources[page - 1].truncateProps) })), sources[page - 1].subtitle && (_jsx("span", { className: "pf-chatbot__sources-card-subtitle", children: sources[page - 1].subtitle }))] }) })), sources[page - 1].body && (_jsx(CardBody, Object.assign({ className: `pf-chatbot__sources-card-body ${sources[page - 1].footer ? 'pf-chatbot__compact-sources-card-body' : undefined}` }, cardBodyProps, { children: sources[page - 1].hasShowMore ? (
|
|
36
36
|
// prevents extra VO announcements of button text - parent Message has aria-live
|
|
37
|
-
_jsx("div", { "aria-live": "off", children: _jsx(ExpandableSection, { variant: ExpandableSectionVariant.truncate, toggleText: isExpanded ? showLessWords : showMoreWords, onToggle: onToggle, isExpanded: isExpanded, truncateMaxLines: 2, children: sources[page - 1].body }) })) : (_jsx("div", { className: "pf-chatbot__sources-card-body-text", children: sources[page - 1].body })) })), sources.length > 1 && (_jsx(CardFooter, { className: "pf-chatbot__sources-card-footer-container", children: _jsx("div", { className: "pf-chatbot__sources-card-footer", children: _jsxs("nav", { className: `pf-chatbot__sources-card-footer-buttons ${className}`, "aria-label": paginationAriaLabel, children: [_jsx(Button, { variant: ButtonVariant.plain, isDisabled: isDisabled || page === 1, "data-action": "previous", onClick: (event) => {
|
|
37
|
+
_jsx("div", { "aria-live": "off", children: _jsx(ExpandableSection, { variant: ExpandableSectionVariant.truncate, toggleText: isExpanded ? showLessWords : showMoreWords, onToggle: onToggle, isExpanded: isExpanded, truncateMaxLines: 2, children: sources[page - 1].body }) })) : (_jsx("div", { className: "pf-chatbot__sources-card-body-text", children: sources[page - 1].body })) }))), sources[page - 1].footer ? (_jsx(CardFooter, Object.assign({ className: "pf-chatbot__sources-card-footer" }, cardFooterProps, { children: sources[page - 1].footer }))) : (sources.length > 1 && (_jsx(CardFooter, Object.assign({ className: "pf-chatbot__sources-card-footer-container" }, cardFooterProps, { children: _jsx("div", { className: "pf-chatbot__sources-card-footer", children: _jsxs("nav", { className: `pf-chatbot__sources-card-footer-buttons ${className}`, "aria-label": paginationAriaLabel, children: [_jsx(Button, { variant: ButtonVariant.plain, isDisabled: isDisabled || page === 1, "data-action": "previous", onClick: (event) => {
|
|
38
38
|
const newPage = page >= 1 ? page - 1 : 1;
|
|
39
39
|
onPreviousClick && onPreviousClick(event, newPage);
|
|
40
40
|
handleNewPage(event, newPage);
|
|
@@ -42,6 +42,6 @@ const SourcesCard = (_a) => {
|
|
|
42
42
|
const newPage = page + 1 <= sources.length ? page + 1 : sources.length;
|
|
43
43
|
onNextClick && onNextClick(event, newPage);
|
|
44
44
|
handleNewPage(event, newPage);
|
|
45
|
-
}, children: _jsx(Icon, { isInline: true, iconSize: "lg", children: _jsx("svg", { className: "pf-v6-svg", viewBox: "0 0 180 500", fill: "currentColor", "aria-hidden": "true", role: "img", width: "1em", height: "1em", children: _jsx("path", { d: "M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z" }) }) }) })] }) }) }))] }))] }));
|
|
45
|
+
}, children: _jsx(Icon, { isInline: true, iconSize: "lg", children: _jsx("svg", { className: "pf-v6-svg", viewBox: "0 0 180 500", fill: "currentColor", "aria-hidden": "true", role: "img", width: "1em", height: "1em", children: _jsx("path", { d: "M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z" }) }) }) })] }) }) }))))] }))] }));
|
|
46
46
|
};
|
|
47
47
|
export default SourcesCard;
|
|
@@ -7,7 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
11
11
|
import { render, screen } from '@testing-library/react';
|
|
12
12
|
import userEvent from '@testing-library/user-event';
|
|
13
13
|
import '@testing-library/jest-dom';
|
|
@@ -179,4 +179,53 @@ describe('SourcesCard', () => {
|
|
|
179
179
|
render(_jsx(SourcesCard, { sources: [{ title: 'How to make an apple pie', link: '', titleProps: { className: 'test' } }] }));
|
|
180
180
|
expect(screen.getByRole('link', { name: /How to make an apple pie/i })).toHaveClass('test');
|
|
181
181
|
});
|
|
182
|
+
it('should apply cardTitleProps appropriately', () => {
|
|
183
|
+
render(_jsx(SourcesCard, { cardTitleProps: { 'data-testid': 'card-title', className: 'test' }, sources: [{ title: 'How to make an apple pie', link: '' }] }));
|
|
184
|
+
expect(screen.getByTestId('card-title')).toHaveClass('test');
|
|
185
|
+
});
|
|
186
|
+
it('should apply cardBodyProps appropriately', () => {
|
|
187
|
+
render(_jsx(SourcesCard, { cardBodyProps: { 'data-testid': 'card-body', body: 'To make an apple pie, you must first...', className: 'test' }, sources: [{ title: 'How to make an apple pie', link: '', body: 'To make an apple pie, you must first...' }] }));
|
|
188
|
+
expect(screen.getByTestId('card-body')).toHaveClass('test');
|
|
189
|
+
});
|
|
190
|
+
it('should apply cardFooterProps appropriately', () => {
|
|
191
|
+
render(_jsx(SourcesCard, { cardFooterProps: { 'data-testid': 'card-footer', className: 'test' }, sources: [
|
|
192
|
+
{ title: 'How to make an apple pie', link: '' },
|
|
193
|
+
{ title: 'How to make cookies', link: '' }
|
|
194
|
+
] }));
|
|
195
|
+
expect(screen.getByTestId('card-footer')).toHaveClass('test');
|
|
196
|
+
});
|
|
197
|
+
it('should apply truncateProps appropriately', () => {
|
|
198
|
+
render(_jsx(SourcesCard, { sources: [
|
|
199
|
+
{
|
|
200
|
+
title: 'How to make an apple pie',
|
|
201
|
+
link: '',
|
|
202
|
+
truncateProps: { 'data-testid': 'card-truncate', className: 'test' }
|
|
203
|
+
}
|
|
204
|
+
] }));
|
|
205
|
+
expect(screen.getByTestId('card-truncate')).toHaveClass('test');
|
|
206
|
+
});
|
|
207
|
+
it('should apply custom footer appropriately when there is one source', () => {
|
|
208
|
+
render(_jsx(SourcesCard, { sources: [{ title: 'How to make an apple pie', link: '', footer: _jsx(_Fragment, { children: "I am a custom footer" }) }] }));
|
|
209
|
+
expect(screen.getByText('I am a custom footer'));
|
|
210
|
+
expect(screen.queryByText('1/1')).toBeFalsy();
|
|
211
|
+
});
|
|
212
|
+
it('should apply custom footer appropriately when are multiple sources', () => {
|
|
213
|
+
render(_jsx(SourcesCard, { sources: [
|
|
214
|
+
{ title: 'How to make an apple pie', link: '', footer: _jsx(_Fragment, { children: "I am a custom footer" }) },
|
|
215
|
+
{ title: 'How to bake bread', link: '' }
|
|
216
|
+
] }));
|
|
217
|
+
expect(screen.getByText('I am a custom footer'));
|
|
218
|
+
// does not show navigation bar
|
|
219
|
+
expect(screen.queryByText('1/2')).toBeFalsy();
|
|
220
|
+
});
|
|
221
|
+
it('should apply footer props to custom footer appropriately', () => {
|
|
222
|
+
render(_jsx(SourcesCard, { cardFooterProps: { 'data-testid': 'card-footer', className: 'test' }, sources: [{ title: 'How to make an apple pie', link: '', footer: _jsx(_Fragment, { children: "I am a custom footer" }) }] }));
|
|
223
|
+
expect(screen.getByText('I am a custom footer'));
|
|
224
|
+
expect(screen.getByTestId('card-footer')).toHaveClass('test');
|
|
225
|
+
});
|
|
226
|
+
it('should apply subtitle appropriately', () => {
|
|
227
|
+
render(_jsx(SourcesCard, { sources: [{ title: 'How to make an apple pie', link: '', subtitle: 'You must first create the universe' }] }));
|
|
228
|
+
expect(screen.getByText('How to make an apple pie'));
|
|
229
|
+
expect(screen.getByText('You must first create the universe'));
|
|
230
|
+
});
|
|
182
231
|
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { CardBodyProps, CardProps, CardTitleProps, DividerProps, ExpandableSectionProps } from '@patternfly/react-core';
|
|
2
|
+
import { type FunctionComponent } from 'react';
|
|
3
|
+
export interface ToolResponseProps {
|
|
4
|
+
/** Toggle content shown for expandable section */
|
|
5
|
+
toggleContent: React.ReactNode;
|
|
6
|
+
/** Additional props passed to expandable section */
|
|
7
|
+
expandableSectionProps?: Omit<ExpandableSectionProps, 'ref'>;
|
|
8
|
+
/** Subheading rendered inside expandable section */
|
|
9
|
+
subheading?: string;
|
|
10
|
+
/** Body text rendered inside expandable section */
|
|
11
|
+
body?: React.ReactNode | string;
|
|
12
|
+
/** Content passed into tool response card body */
|
|
13
|
+
cardBody: React.ReactNode;
|
|
14
|
+
/** Content passed into tool response card title */
|
|
15
|
+
cardTitle: React.ReactNode;
|
|
16
|
+
/** Additional props passed to main card */
|
|
17
|
+
cardProps?: CardProps;
|
|
18
|
+
/** Additional props passed to main card body */
|
|
19
|
+
cardBodyProps?: CardBodyProps;
|
|
20
|
+
/** Additional props passed to tool response card */
|
|
21
|
+
toolResponseCardProps?: CardProps;
|
|
22
|
+
/** Additional props passed to tool response card body */
|
|
23
|
+
toolResponseCardBodyProps?: CardBodyProps;
|
|
24
|
+
/** Additional props passed to tool response card divider */
|
|
25
|
+
toolResponseCardDividerProps?: DividerProps;
|
|
26
|
+
/** Additional props passed to tool response card title */
|
|
27
|
+
toolResponseCardTitleProps?: CardTitleProps;
|
|
28
|
+
}
|
|
29
|
+
export declare const ToolResponse: FunctionComponent<ToolResponseProps>;
|
|
30
|
+
export default ToolResponse;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Tool Response Card
|
|
4
|
+
// ============================================================================
|
|
5
|
+
import { Card, CardBody, CardTitle, Divider, ExpandableSection } from '@patternfly/react-core';
|
|
6
|
+
import { useState } from 'react';
|
|
7
|
+
export const ToolResponse = ({ body, cardProps, expandableSectionProps, subheading, cardBody, cardTitle, cardBodyProps, toggleContent, toolResponseCardBodyProps, toolResponseCardDividerProps, toolResponseCardProps, toolResponseCardTitleProps }) => {
|
|
8
|
+
const [isExpanded, setIsExpanded] = useState(true);
|
|
9
|
+
const onToggle = (_event, isExpanded) => {
|
|
10
|
+
setIsExpanded(isExpanded);
|
|
11
|
+
};
|
|
12
|
+
return (_jsx(Card, Object.assign({ isCompact: true, className: "pf-chatbot__tool-response" }, cardProps, { children: _jsx(CardBody, Object.assign({}, cardBodyProps, { children: _jsx(ExpandableSection, Object.assign({ toggleContent: toggleContent, onToggle: onToggle, isExpanded: isExpanded, isIndented: true, className: "pf-chatbot__tool-response-expandable-section" }, expandableSectionProps, { children: _jsxs("div", { className: "pf-chatbot__tool-response-section", children: [subheading && (_jsx("div", { className: "pf-chatbot__tool-response-subheading", children: _jsx("span", { children: subheading }) })), body && _jsx("div", { className: "pf-chatbot__tool-response-body", children: body }), _jsxs(Card, Object.assign({ isCompact: true, className: "pf-chatbot__tool-response-card" }, toolResponseCardProps, { children: [_jsx(CardTitle, Object.assign({}, toolResponseCardTitleProps, { children: cardTitle })), _jsx(Divider, Object.assign({}, toolResponseCardDividerProps)), _jsx(CardBody, Object.assign({}, toolResponseCardBodyProps, { children: cardBody }))] }))] }) })) })) })));
|
|
13
|
+
};
|
|
14
|
+
export default ToolResponse;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import '@testing-library/jest-dom';
|
|
4
|
+
import ToolResponse from './ToolResponse';
|
|
5
|
+
describe('ToolResponse', () => {
|
|
6
|
+
const defaultProps = {
|
|
7
|
+
toggleContent: 'Tool response: toolName',
|
|
8
|
+
cardTitle: 'Title',
|
|
9
|
+
cardBody: 'Body'
|
|
10
|
+
};
|
|
11
|
+
it('should render with required props only', () => {
|
|
12
|
+
render(_jsx(ToolResponse, Object.assign({}, defaultProps)));
|
|
13
|
+
expect(screen.getByText('Title')).toBeTruthy();
|
|
14
|
+
expect(screen.getByText('Body')).toBeTruthy();
|
|
15
|
+
expect(screen.getByText('Tool response: toolName')).toBeTruthy();
|
|
16
|
+
});
|
|
17
|
+
it('should render subheading when provided', () => {
|
|
18
|
+
const subheading = 'Tool execution result';
|
|
19
|
+
render(_jsx(ToolResponse, Object.assign({}, defaultProps, { subheading: subheading })));
|
|
20
|
+
expect(screen.getByText(subheading)).toBeTruthy();
|
|
21
|
+
});
|
|
22
|
+
it('should render body content when provided', () => {
|
|
23
|
+
const body = 'This is the tool response body content';
|
|
24
|
+
render(_jsx(ToolResponse, Object.assign({}, defaultProps, { body: body })));
|
|
25
|
+
expect(screen.getByText(body)).toBeTruthy();
|
|
26
|
+
});
|
|
27
|
+
it('should render with complex content including React elements', () => {
|
|
28
|
+
const body = (_jsxs("div", { children: [_jsx("p", { children: "Complex body content" }), _jsxs("ul", { children: [_jsx("li", { children: "Item 1" }), _jsx("li", { children: "Item 2" })] })] }));
|
|
29
|
+
const cardTitle = _jsx("strong", { children: "API Response" });
|
|
30
|
+
const cardBody = (_jsx("div", { children: _jsx("code", { children: "{ status: 'success' }" }) }));
|
|
31
|
+
render(_jsx(ToolResponse, Object.assign({}, defaultProps, { body: body, cardTitle: cardTitle, cardBody: cardBody })));
|
|
32
|
+
expect(screen.getByText('Complex body content')).toBeTruthy();
|
|
33
|
+
expect(screen.getByText('Item 1')).toBeTruthy();
|
|
34
|
+
expect(screen.getByText('Item 2')).toBeTruthy();
|
|
35
|
+
expect(screen.getByText('API Response')).toBeTruthy();
|
|
36
|
+
expect(screen.getByText("{ status: 'success' }")).toBeTruthy();
|
|
37
|
+
});
|
|
38
|
+
it('should apply custom className from cardProps', () => {
|
|
39
|
+
const { container } = render(_jsx(ToolResponse, Object.assign({}, defaultProps, { cardProps: { className: 'custom-tool-response-class' } })));
|
|
40
|
+
expect(container.querySelector('.custom-tool-response-class')).toBeTruthy();
|
|
41
|
+
});
|
|
42
|
+
it('should pass through expandableSectionProps', () => {
|
|
43
|
+
render(_jsx(ToolResponse, Object.assign({}, defaultProps, { expandableSectionProps: { className: 'custom-expandable-class' } })));
|
|
44
|
+
expect(document.querySelector('.custom-expandable-class')).toBeTruthy();
|
|
45
|
+
});
|
|
46
|
+
it('should pass through toolResponseCardProps', () => {
|
|
47
|
+
render(_jsx(ToolResponse, Object.assign({}, defaultProps, { toolResponseCardProps: { className: 'custom-card-class' } })));
|
|
48
|
+
expect(document.querySelector('.custom-card-class')).toBeTruthy();
|
|
49
|
+
});
|
|
50
|
+
it('should not render subheading span when subheading is not provided', () => {
|
|
51
|
+
const { container } = render(_jsx(ToolResponse, Object.assign({}, defaultProps)));
|
|
52
|
+
const subheadingContainer = container.querySelector('.pf-chatbot__tool-response-subheading');
|
|
53
|
+
expect(subheadingContainer).toBeFalsy();
|
|
54
|
+
});
|
|
55
|
+
});
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -26,12 +26,16 @@ export { default as CodeModal } from './CodeModal';
|
|
|
26
26
|
export * from './CodeModal';
|
|
27
27
|
export { default as Compare } from './Compare';
|
|
28
28
|
export * from './Compare';
|
|
29
|
+
export { default as DeepThinking } from './DeepThinking';
|
|
30
|
+
export * from './DeepThinking';
|
|
29
31
|
export { default as FileDetails } from './FileDetails';
|
|
30
32
|
export * from './FileDetails';
|
|
31
33
|
export { default as FileDetailsLabel } from './FileDetailsLabel';
|
|
32
34
|
export * from './FileDetailsLabel';
|
|
33
35
|
export { default as FileDropZone } from './FileDropZone';
|
|
34
36
|
export * from './FileDropZone';
|
|
37
|
+
export { default as FilePreview } from './FilePreview';
|
|
38
|
+
export * from './FilePreview';
|
|
35
39
|
export { default as LoadingMessage } from './LoadingMessage';
|
|
36
40
|
export * from './LoadingMessage';
|
|
37
41
|
export { default as Message } from './Message';
|
|
@@ -54,5 +58,7 @@ export { default as SourcesCard } from './SourcesCard';
|
|
|
54
58
|
export * from './SourcesCard';
|
|
55
59
|
export { default as TermsOfUse } from './TermsOfUse';
|
|
56
60
|
export * from './TermsOfUse';
|
|
61
|
+
export { default as ToolResponse } from './ToolResponse';
|
|
62
|
+
export * from './ToolResponse';
|
|
57
63
|
export { default as tracking } from './tracking';
|
|
58
64
|
export * from './tracking';
|
package/dist/esm/index.js
CHANGED
|
@@ -27,12 +27,16 @@ export { default as CodeModal } from './CodeModal';
|
|
|
27
27
|
export * from './CodeModal';
|
|
28
28
|
export { default as Compare } from './Compare';
|
|
29
29
|
export * from './Compare';
|
|
30
|
+
export { default as DeepThinking } from './DeepThinking';
|
|
31
|
+
export * from './DeepThinking';
|
|
30
32
|
export { default as FileDetails } from './FileDetails';
|
|
31
33
|
export * from './FileDetails';
|
|
32
34
|
export { default as FileDetailsLabel } from './FileDetailsLabel';
|
|
33
35
|
export * from './FileDetailsLabel';
|
|
34
36
|
export { default as FileDropZone } from './FileDropZone';
|
|
35
37
|
export * from './FileDropZone';
|
|
38
|
+
export { default as FilePreview } from './FilePreview';
|
|
39
|
+
export * from './FilePreview';
|
|
36
40
|
export { default as LoadingMessage } from './LoadingMessage';
|
|
37
41
|
export * from './LoadingMessage';
|
|
38
42
|
export { default as Message } from './Message';
|
|
@@ -55,5 +59,7 @@ export { default as SourcesCard } from './SourcesCard';
|
|
|
55
59
|
export * from './SourcesCard';
|
|
56
60
|
export { default as TermsOfUse } from './TermsOfUse';
|
|
57
61
|
export * from './TermsOfUse';
|
|
62
|
+
export { default as ToolResponse } from './ToolResponse';
|
|
63
|
+
export * from './ToolResponse';
|
|
58
64
|
export { default as tracking } from './tracking';
|
|
59
65
|
export * from './tracking';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/index.ts","../src/AttachMenu/AttachMenu.tsx","../src/AttachMenu/index.ts","../src/AttachmentEdit/AttachmentEdit.test.tsx","../src/AttachmentEdit/AttachmentEdit.tsx","../src/AttachmentEdit/index.ts","../src/Chatbot/Chatbot.test.tsx","../src/Chatbot/Chatbot.tsx","../src/Chatbot/index.ts","../src/ChatbotAlert/ChatbotAlert.test.tsx","../src/ChatbotAlert/ChatbotAlert.tsx","../src/ChatbotAlert/index.ts","../src/ChatbotContent/ChatbotContent.test.tsx","../src/ChatbotContent/ChatbotContent.tsx","../src/ChatbotContent/index.ts","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx","../src/ChatbotConversationHistoryNav/EmptyState.tsx","../src/ChatbotConversationHistoryNav/LoadingState.tsx","../src/ChatbotConversationHistoryNav/index.ts","../src/ChatbotFooter/ChatbotFooter.test.tsx","../src/ChatbotFooter/ChatbotFooter.tsx","../src/ChatbotFooter/ChatbotFooternote.test.tsx","../src/ChatbotFooter/ChatbotFootnote.tsx","../src/ChatbotFooter/index.ts","../src/ChatbotHeader/ChatbotHeader.test.tsx","../src/ChatbotHeader/ChatbotHeader.tsx","../src/ChatbotHeader/ChatbotHeaderActions.test.tsx","../src/ChatbotHeader/ChatbotHeaderActions.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.tsx","../src/ChatbotHeader/ChatbotHeaderMain.test.tsx","../src/ChatbotHeader/ChatbotHeaderMain.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.test.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.test.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.tsx","../src/ChatbotHeader/index.ts","../src/ChatbotModal/ChatbotModal.test.tsx","../src/ChatbotModal/ChatbotModal.tsx","../src/ChatbotModal/index.ts","../src/ChatbotPopover/ChatbotPopover.tsx","../src/ChatbotPopover/index.ts","../src/ChatbotToggle/ChatbotToggle.test.tsx","../src/ChatbotToggle/ChatbotToggle.tsx","../src/ChatbotToggle/index.ts","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.tsx","../src/ChatbotWelcomePrompt/index.ts","../src/CodeModal/CodeModal.test.tsx","../src/CodeModal/CodeModal.tsx","../src/CodeModal/index.ts","../src/Compare/Compare.test.tsx","../src/Compare/Compare.tsx","../src/Compare/index.ts","../src/FileDetails/FileDetails.test.tsx","../src/FileDetails/FileDetails.tsx","../src/FileDetails/index.ts","../src/FileDetailsLabel/FileDetailsLabel.test.tsx","../src/FileDetailsLabel/FileDetailsLabel.tsx","../src/FileDetailsLabel/index.ts","../src/FileDropZone/FileDropZone.test.tsx","../src/FileDropZone/FileDropZone.tsx","../src/FileDropZone/index.ts","../src/LoadingMessage/LoadingMessage.test.tsx","../src/LoadingMessage/LoadingMessage.tsx","../src/LoadingMessage/index.ts","../src/Message/Message.test.tsx","../src/Message/Message.tsx","../src/Message/MessageInput.tsx","../src/Message/MessageLoading.tsx","../src/Message/index.ts","../src/Message/CodeBlockMessage/CodeBlockMessage.tsx","../src/Message/ErrorMessage/ErrorMessage.tsx","../src/Message/ImageMessage/ImageMessage.tsx","../src/Message/LinkMessage/LinkMessage.tsx","../src/Message/ListMessage/ListItemMessage.tsx","../src/Message/ListMessage/OrderedListMessage.tsx","../src/Message/ListMessage/UnorderedListMessage.tsx","../src/Message/Plugins/index.ts","../src/Message/Plugins/rehypeCodeBlockToggle.ts","../src/Message/Plugins/rehypeMoveImagesOutOfParagraphs.ts","../src/Message/QuickResponse/QuickResponse.tsx","../src/Message/QuickStarts/FallbackImg.tsx","../src/Message/QuickStarts/QuickStartTile.tsx","../src/Message/QuickStarts/QuickStartTileDescription.test.tsx","../src/Message/QuickStarts/QuickStartTileDescription.tsx","../src/Message/QuickStarts/QuickStartTileHeader.tsx","../src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts","../src/Message/QuickStarts/monitor-sampleapp-quickstart.ts","../src/Message/QuickStarts/types.ts","../src/Message/TableMessage/TableMessage.tsx","../src/Message/TableMessage/TbodyMessage.tsx","../src/Message/TableMessage/TdMessage.tsx","../src/Message/TableMessage/ThMessage.tsx","../src/Message/TableMessage/TheadMessage.tsx","../src/Message/TableMessage/TrMessage.tsx","../src/Message/TextMessage/TextMessage.tsx","../src/Message/UserFeedback/CloseButton.tsx","../src/Message/UserFeedback/UserFeedback.test.tsx","../src/Message/UserFeedback/UserFeedback.tsx","../src/Message/UserFeedback/UserFeedbackComplete.test.tsx","../src/Message/UserFeedback/UserFeedbackComplete.tsx","../src/MessageBar/AttachButton.test.tsx","../src/MessageBar/AttachButton.tsx","../src/MessageBar/MessageBar.test.tsx","../src/MessageBar/MessageBar.tsx","../src/MessageBar/MicrophoneButton.tsx","../src/MessageBar/SendButton.test.tsx","../src/MessageBar/SendButton.tsx","../src/MessageBar/StopButton.test.tsx","../src/MessageBar/StopButton.tsx","../src/MessageBar/index.ts","../src/MessageBox/JumpButton.test.tsx","../src/MessageBox/JumpButton.tsx","../src/MessageBox/MessageBox.test.tsx","../src/MessageBox/MessageBox.tsx","../src/MessageBox/index.ts","../src/MessageDivider/MessageDivider.test.tsx","../src/MessageDivider/MessageDivider.tsx","../src/MessageDivider/index.ts","../src/PreviewAttachment/PreviewAttachment.test.tsx","../src/PreviewAttachment/PreviewAttachment.tsx","../src/PreviewAttachment/index.ts","../src/ResponseActions/ResponseActionButton.test.tsx","../src/ResponseActions/ResponseActionButton.tsx","../src/ResponseActions/ResponseActions.test.tsx","../src/ResponseActions/ResponseActions.tsx","../src/ResponseActions/index.ts","../src/Settings/SettingsForm.test.tsx","../src/Settings/SettingsForm.tsx","../src/Settings/index.ts","../src/SourceDetailsMenuItem/SourceDetailsMenuItem.tsx","../src/SourceDetailsMenuItem/index.ts","../src/SourcesCard/SourcesCard.test.tsx","../src/SourcesCard/SourcesCard.tsx","../src/SourcesCard/index.ts","../src/TermsOfUse/TermsOfUse.test.tsx","../src/TermsOfUse/TermsOfUse.tsx","../src/TermsOfUse/index.ts","../src/__mocks__/rehype-external-links.ts","../src/__mocks__/rehype-sanitize.ts","../src/__mocks__/rehype-unwrap-images.tsx","../src/tracking/console_tracking_provider.ts","../src/tracking/index.ts","../src/tracking/posthog_tracking_provider.ts","../src/tracking/segment_tracking_provider.ts","../src/tracking/trackingProviderProxy.ts","../src/tracking/tracking_api.ts","../src/tracking/tracking_registry.ts","../src/tracking/tracking_spi.ts","../src/tracking/umami_tracking_provider.ts"],"version":"5.6.3"}
|
|
1
|
+
{"root":["../src/index.ts","../src/AttachMenu/AttachMenu.tsx","../src/AttachMenu/index.ts","../src/AttachmentEdit/AttachmentEdit.test.tsx","../src/AttachmentEdit/AttachmentEdit.tsx","../src/AttachmentEdit/index.ts","../src/Chatbot/Chatbot.test.tsx","../src/Chatbot/Chatbot.tsx","../src/Chatbot/index.ts","../src/ChatbotAlert/ChatbotAlert.test.tsx","../src/ChatbotAlert/ChatbotAlert.tsx","../src/ChatbotAlert/index.ts","../src/ChatbotContent/ChatbotContent.test.tsx","../src/ChatbotContent/ChatbotContent.tsx","../src/ChatbotContent/index.ts","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx","../src/ChatbotConversationHistoryNav/EmptyState.tsx","../src/ChatbotConversationHistoryNav/LoadingState.tsx","../src/ChatbotConversationHistoryNav/index.ts","../src/ChatbotFooter/ChatbotFooter.test.tsx","../src/ChatbotFooter/ChatbotFooter.tsx","../src/ChatbotFooter/ChatbotFooternote.test.tsx","../src/ChatbotFooter/ChatbotFootnote.tsx","../src/ChatbotFooter/index.ts","../src/ChatbotHeader/ChatbotHeader.test.tsx","../src/ChatbotHeader/ChatbotHeader.tsx","../src/ChatbotHeader/ChatbotHeaderActions.test.tsx","../src/ChatbotHeader/ChatbotHeaderActions.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.tsx","../src/ChatbotHeader/ChatbotHeaderMain.test.tsx","../src/ChatbotHeader/ChatbotHeaderMain.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.test.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.tsx","../src/ChatbotHeader/ChatbotHeaderNewChatButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderNewChatButton.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.test.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.tsx","../src/ChatbotHeader/index.ts","../src/ChatbotModal/ChatbotModal.test.tsx","../src/ChatbotModal/ChatbotModal.tsx","../src/ChatbotModal/index.ts","../src/ChatbotPopover/ChatbotPopover.tsx","../src/ChatbotPopover/index.ts","../src/ChatbotToggle/ChatbotToggle.test.tsx","../src/ChatbotToggle/ChatbotToggle.tsx","../src/ChatbotToggle/index.ts","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.tsx","../src/ChatbotWelcomePrompt/index.ts","../src/CodeModal/CodeModal.test.tsx","../src/CodeModal/CodeModal.tsx","../src/CodeModal/index.ts","../src/Compare/Compare.test.tsx","../src/Compare/Compare.tsx","../src/Compare/index.ts","../src/DeepThinking/DeepThinking.test.tsx","../src/DeepThinking/DeepThinking.tsx","../src/DeepThinking/index.ts","../src/FileDetails/FileDetails.test.tsx","../src/FileDetails/FileDetails.tsx","../src/FileDetails/index.ts","../src/FileDetailsLabel/FileDetailsLabel.test.tsx","../src/FileDetailsLabel/FileDetailsLabel.tsx","../src/FileDetailsLabel/index.ts","../src/FileDropZone/FileDropZone.test.tsx","../src/FileDropZone/FileDropZone.tsx","../src/FileDropZone/index.ts","../src/FilePreview/FilePreview.test.tsx","../src/FilePreview/FilePreview.tsx","../src/FilePreview/index.ts","../src/LoadingMessage/LoadingMessage.test.tsx","../src/LoadingMessage/LoadingMessage.tsx","../src/LoadingMessage/index.ts","../src/Message/Message.test.tsx","../src/Message/Message.tsx","../src/Message/MessageInput.tsx","../src/Message/MessageLoading.tsx","../src/Message/index.ts","../src/Message/CodeBlockMessage/CodeBlockMessage.tsx","../src/Message/ErrorMessage/ErrorMessage.tsx","../src/Message/ImageMessage/ImageMessage.tsx","../src/Message/LinkMessage/LinkMessage.tsx","../src/Message/ListMessage/ListItemMessage.tsx","../src/Message/ListMessage/OrderedListMessage.tsx","../src/Message/ListMessage/UnorderedListMessage.tsx","../src/Message/Plugins/index.ts","../src/Message/Plugins/rehypeCodeBlockToggle.ts","../src/Message/Plugins/rehypeMoveImagesOutOfParagraphs.ts","../src/Message/QuickResponse/QuickResponse.tsx","../src/Message/QuickStarts/FallbackImg.tsx","../src/Message/QuickStarts/QuickStartTile.tsx","../src/Message/QuickStarts/QuickStartTileDescription.test.tsx","../src/Message/QuickStarts/QuickStartTileDescription.tsx","../src/Message/QuickStarts/QuickStartTileHeader.tsx","../src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts","../src/Message/QuickStarts/monitor-sampleapp-quickstart.ts","../src/Message/QuickStarts/types.ts","../src/Message/SuperscriptMessage/SuperscriptMessage.tsx","../src/Message/TableMessage/TableMessage.tsx","../src/Message/TableMessage/TbodyMessage.tsx","../src/Message/TableMessage/TdMessage.tsx","../src/Message/TableMessage/ThMessage.tsx","../src/Message/TableMessage/TheadMessage.tsx","../src/Message/TableMessage/TrMessage.tsx","../src/Message/TextMessage/TextMessage.tsx","../src/Message/UserFeedback/CloseButton.tsx","../src/Message/UserFeedback/UserFeedback.test.tsx","../src/Message/UserFeedback/UserFeedback.tsx","../src/Message/UserFeedback/UserFeedbackComplete.test.tsx","../src/Message/UserFeedback/UserFeedbackComplete.tsx","../src/MessageBar/AttachButton.test.tsx","../src/MessageBar/AttachButton.tsx","../src/MessageBar/MessageBar.test.tsx","../src/MessageBar/MessageBar.tsx","../src/MessageBar/MicrophoneButton.tsx","../src/MessageBar/SendButton.test.tsx","../src/MessageBar/SendButton.tsx","../src/MessageBar/StopButton.test.tsx","../src/MessageBar/StopButton.tsx","../src/MessageBar/index.ts","../src/MessageBox/JumpButton.test.tsx","../src/MessageBox/JumpButton.tsx","../src/MessageBox/MessageBox.test.tsx","../src/MessageBox/MessageBox.tsx","../src/MessageBox/index.ts","../src/MessageDivider/MessageDivider.test.tsx","../src/MessageDivider/MessageDivider.tsx","../src/MessageDivider/index.ts","../src/PreviewAttachment/PreviewAttachment.test.tsx","../src/PreviewAttachment/PreviewAttachment.tsx","../src/PreviewAttachment/index.ts","../src/ResponseActions/ResponseActionButton.test.tsx","../src/ResponseActions/ResponseActionButton.tsx","../src/ResponseActions/ResponseActions.test.tsx","../src/ResponseActions/ResponseActions.tsx","../src/ResponseActions/index.ts","../src/Settings/SettingsForm.test.tsx","../src/Settings/SettingsForm.tsx","../src/Settings/index.ts","../src/SourceDetailsMenuItem/SourceDetailsMenuItem.tsx","../src/SourceDetailsMenuItem/index.ts","../src/SourcesCard/SourcesCard.test.tsx","../src/SourcesCard/SourcesCard.tsx","../src/SourcesCard/index.ts","../src/TermsOfUse/TermsOfUse.test.tsx","../src/TermsOfUse/TermsOfUse.tsx","../src/TermsOfUse/index.ts","../src/ToolResponse/ToolResponse.test.tsx","../src/ToolResponse/ToolResponse.tsx","../src/ToolResponse/index.ts","../src/__mocks__/rehype-external-links.ts","../src/__mocks__/rehype-sanitize.ts","../src/__mocks__/rehype-unwrap-images.tsx","../src/tracking/console_tracking_provider.ts","../src/tracking/index.ts","../src/tracking/posthog_tracking_provider.ts","../src/tracking/segment_tracking_provider.ts","../src/tracking/trackingProviderProxy.ts","../src/tracking/tracking_api.ts","../src/tracking/tracking_registry.ts","../src/tracking/tracking_spi.ts","../src/tracking/umami_tracking_provider.ts"],"version":"5.6.3"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/chatbot",
|
|
3
|
-
"version": "6.4.0-prerelease.
|
|
3
|
+
"version": "6.4.0-prerelease.20",
|
|
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",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"build": "
|
|
8
|
+
"build": "npm run build:css && npm run build:index && npm run build:js && npm run build:esm && npm run build:fed:packages",
|
|
9
9
|
"build:watch": "npm run build:js && npm run build:esm -- --watch && npm run build:fed:packages -- --watch",
|
|
10
10
|
"build:esm": "tsc --build --verbose ./tsconfig.json",
|
|
11
11
|
"build:fed:packages": "node generate-fed-package-json.js",
|
|
12
12
|
"build:js": "tsc -p tsconfig.cjs.json",
|
|
13
13
|
"build:index": "node generate-index.js",
|
|
14
|
+
"build:css": "sass src/main.scss dist/css/main.css",
|
|
15
|
+
"build:css:watch": "sass src/main.scss dist/css/main.css --watch",
|
|
14
16
|
"clean": "rimraf dist",
|
|
15
17
|
"docs:develop": "pf-docs-framework start",
|
|
16
18
|
"docs:build": "pf-docs-framework build all --output public",
|
|
@@ -38,7 +40,6 @@
|
|
|
38
40
|
"@segment/analytics-next": "^1.76.0",
|
|
39
41
|
"posthog-js": "^1.194.4",
|
|
40
42
|
"clsx": "^2.1.0",
|
|
41
|
-
"framer-motion": "^11.3.28",
|
|
42
43
|
"react-markdown": "^9.0.1",
|
|
43
44
|
"remark-gfm": "^4.0.0",
|
|
44
45
|
"rehype-unwrap-images": "^1.0.0",
|
|
@@ -48,11 +49,11 @@
|
|
|
48
49
|
"unist-util-visit": "^5.0.0"
|
|
49
50
|
},
|
|
50
51
|
"peerDependencies": {
|
|
51
|
-
"react": "^
|
|
52
|
-
"react-dom": "^
|
|
52
|
+
"react": "^18 || ^19",
|
|
53
|
+
"react-dom": "^18 || ^19"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
55
|
-
"@patternfly/documentation-framework": "6.
|
|
56
|
+
"@patternfly/documentation-framework": "6.19.0",
|
|
56
57
|
"@patternfly/patternfly": "^6.1.0",
|
|
57
58
|
"@patternfly/patternfly-a11y": "^5.0.0",
|
|
58
59
|
"@types/dom-speech-recognition": "^0.0.4",
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
CSSProperties,
|
|
3
|
+
useState,
|
|
4
|
+
Fragment,
|
|
5
|
+
FunctionComponent,
|
|
6
|
+
MouseEvent as ReactMouseEvent,
|
|
7
|
+
KeyboardEvent as ReactKeyboardEvent,
|
|
8
|
+
Ref
|
|
9
|
+
} from 'react';
|
|
2
10
|
import Message from '@patternfly/chatbot/dist/dynamic/Message';
|
|
3
11
|
import patternflyAvatar from './patternfly_avatar.jpg';
|
|
4
12
|
import squareImg from './PF-social-color-square.svg';
|
|
@@ -44,6 +52,8 @@ export const BotMessageExample: FunctionComponent = () => {
|
|
|
44
52
|
return table;
|
|
45
53
|
case 'Image':
|
|
46
54
|
return image;
|
|
55
|
+
case 'Footnote':
|
|
56
|
+
return footnote;
|
|
47
57
|
default:
|
|
48
58
|
return;
|
|
49
59
|
}
|
|
@@ -150,6 +160,18 @@ _Italic text, formatted with single underscores_
|
|
|
150
160
|
|
|
151
161
|
const image = ``;
|
|
152
162
|
|
|
163
|
+
const footnote = `This is some text that has a short footnote[^1] and this is text with a longer footnote.[^bignote]
|
|
164
|
+
|
|
165
|
+
[^1]: This is a short footnote. To return the highlight to the original message, click the arrow.
|
|
166
|
+
|
|
167
|
+
[^bignote]: This is a long footnote with multiple paragraphs and formatting.
|
|
168
|
+
|
|
169
|
+
To break long footnotes into paragraphs, indent the text.
|
|
170
|
+
|
|
171
|
+
Add as many paragraphs as you like. You can include *italic text*, **bold text**, and \`code\`.
|
|
172
|
+
|
|
173
|
+
> You can even include blockquotes in footnotes!`;
|
|
174
|
+
|
|
153
175
|
const error = {
|
|
154
176
|
title: 'Could not load chat',
|
|
155
177
|
children: 'Wait a few minutes and check your network settings. If the issue persists: ',
|
|
@@ -165,8 +187,8 @@ _Italic text, formatted with single underscores_
|
|
|
165
187
|
)
|
|
166
188
|
};
|
|
167
189
|
|
|
168
|
-
const onSelect = (_event:
|
|
169
|
-
setVariant(value);
|
|
190
|
+
const onSelect = (_event: ReactMouseEvent<Element, MouseEvent> | undefined, value: string | number | undefined) => {
|
|
191
|
+
setVariant(value as string);
|
|
170
192
|
setSelected(value as string);
|
|
171
193
|
setIsOpen(false);
|
|
172
194
|
if (value === 'Expandable code') {
|
|
@@ -196,6 +218,76 @@ _Italic text, formatted with single underscores_
|
|
|
196
218
|
</MenuToggle>
|
|
197
219
|
);
|
|
198
220
|
|
|
221
|
+
const handleFootnoteNavigation = (event: ReactMouseEvent<HTMLElement> | ReactKeyboardEvent<HTMLElement>) => {
|
|
222
|
+
const target = event.target as HTMLElement;
|
|
223
|
+
|
|
224
|
+
// Depending on whether it is a click event or keyboard event, target may be a link or something like a span
|
|
225
|
+
// Look for the closest anchor element (could be a parent)
|
|
226
|
+
const anchorElement = target.closest('a');
|
|
227
|
+
const href = anchorElement?.getAttribute('href');
|
|
228
|
+
|
|
229
|
+
// Check if this is a footnote link - we only have internal links in this example, so this is all we need here
|
|
230
|
+
if (href && href.startsWith('#')) {
|
|
231
|
+
// Prevent default behavior to avoid page re-render on click in PatternFly docs framework
|
|
232
|
+
event.preventDefault();
|
|
233
|
+
|
|
234
|
+
let targetElement: HTMLElement | null = null;
|
|
235
|
+
const targetId = href.replace('#', '');
|
|
236
|
+
targetElement = document.querySelector(`[id="${targetId}"]`);
|
|
237
|
+
|
|
238
|
+
if (targetElement) {
|
|
239
|
+
let focusTarget = targetElement;
|
|
240
|
+
|
|
241
|
+
// If we found a footnote definition container, focus on the parent li element
|
|
242
|
+
if (targetElement.id?.startsWith('bot-message-fn-')) {
|
|
243
|
+
// Find the parent li element that contains the footnote
|
|
244
|
+
const parentLi = targetElement.closest('li');
|
|
245
|
+
if (parentLi) {
|
|
246
|
+
focusTarget = parentLi as HTMLElement;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
focusTarget.focus();
|
|
251
|
+
|
|
252
|
+
let elementToHighlight = targetElement;
|
|
253
|
+
|
|
254
|
+
// If this is a backref link (going back to footnote reference),
|
|
255
|
+
// we want to highlight more of the ref line and not just the link itself
|
|
256
|
+
// since the target is so small
|
|
257
|
+
if (targetElement.id?.startsWith('bot-message-fnref-')) {
|
|
258
|
+
const refLink = targetElement;
|
|
259
|
+
|
|
260
|
+
// Walk up the DOM to find a meaningful container
|
|
261
|
+
let parent = refLink.parentElement;
|
|
262
|
+
while (parent && parent.tagName.toLowerCase() !== 'p' && parent !== document.body) {
|
|
263
|
+
parent = parent.parentElement;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Use if found, otherwise use the immediate parent or target as a fallback
|
|
267
|
+
elementToHighlight = parent || refLink.parentElement || targetElement;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Briefly highlight the target element for fun to show what you can do
|
|
271
|
+
const originalBackground = elementToHighlight.style.backgroundColor;
|
|
272
|
+
const originalTransition = elementToHighlight.style.transition;
|
|
273
|
+
|
|
274
|
+
elementToHighlight.style.transition = 'background-color 0.3s ease';
|
|
275
|
+
elementToHighlight.style.backgroundColor = 'var(--pf-t--global--background--color--tertiary--default)';
|
|
276
|
+
|
|
277
|
+
setTimeout(() => {
|
|
278
|
+
elementToHighlight.style.backgroundColor = originalBackground;
|
|
279
|
+
setTimeout(() => {
|
|
280
|
+
elementToHighlight.style.transition = originalTransition;
|
|
281
|
+
}, 300);
|
|
282
|
+
}, 1000);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
const onClick = (event: ReactMouseEvent<HTMLElement> | ReactKeyboardEvent<HTMLElement>) => {
|
|
288
|
+
handleFootnoteNavigation(event);
|
|
289
|
+
};
|
|
290
|
+
|
|
199
291
|
return (
|
|
200
292
|
<>
|
|
201
293
|
<Message
|
|
@@ -248,6 +340,7 @@ _Italic text, formatted with single underscores_
|
|
|
248
340
|
<SelectOption value="More complex list">More complex list</SelectOption>
|
|
249
341
|
<SelectOption value="Table">Table</SelectOption>
|
|
250
342
|
<SelectOption value="Image">Image</SelectOption>
|
|
343
|
+
<SelectOption value="Footnote">Footnote</SelectOption>
|
|
251
344
|
<SelectOption value="Error">Error</SelectOption>
|
|
252
345
|
</SelectList>
|
|
253
346
|
</Select>
|
|
@@ -265,6 +358,11 @@ _Italic text, formatted with single underscores_
|
|
|
265
358
|
// The purpose of this plugin is to provide unique link names for the code blocks
|
|
266
359
|
// Because they are in the same message, this requires a custom plugin to parse the syntax tree
|
|
267
360
|
additionalRehypePlugins={[rehypeCodeBlockToggle]}
|
|
361
|
+
linkProps={{ onClick }}
|
|
362
|
+
// clobberPrefix controls the label ids
|
|
363
|
+
reactMarkdownProps={{
|
|
364
|
+
remarkRehypeOptions: { footnoteLabel: 'Bot message footnotes', clobberPrefix: 'bot-message-' }
|
|
365
|
+
}}
|
|
268
366
|
/>
|
|
269
367
|
</>
|
|
270
368
|
);
|