@patternfly/chatbot 6.5.0-prerelease.17 → 6.5.0-prerelease.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +29 -2
  2. package/dist/cjs/CodeModal/CodeModal.d.ts +2 -0
  3. package/dist/cjs/CodeModal/CodeModal.js +53 -12
  4. package/dist/cjs/Onboarding/Onboarding.d.ts +36 -0
  5. package/dist/cjs/Onboarding/Onboarding.js +37 -0
  6. package/dist/cjs/Onboarding/Onboarding.test.d.ts +1 -0
  7. package/dist/cjs/Onboarding/Onboarding.test.js +80 -0
  8. package/dist/cjs/Onboarding/index.d.ts +2 -0
  9. package/dist/cjs/Onboarding/index.js +23 -0
  10. package/dist/cjs/index.d.ts +2 -0
  11. package/dist/cjs/index.js +4 -1
  12. package/dist/css/main.css +83 -0
  13. package/dist/css/main.css.map +1 -1
  14. package/dist/dynamic/Onboarding/package.json +1 -0
  15. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +30 -3
  16. package/dist/esm/CodeModal/CodeModal.d.ts +2 -0
  17. package/dist/esm/CodeModal/CodeModal.js +54 -13
  18. package/dist/esm/Onboarding/Onboarding.d.ts +36 -0
  19. package/dist/esm/Onboarding/Onboarding.js +30 -0
  20. package/dist/esm/Onboarding/Onboarding.test.d.ts +1 -0
  21. package/dist/esm/Onboarding/Onboarding.test.js +75 -0
  22. package/dist/esm/Onboarding/index.d.ts +2 -0
  23. package/dist/esm/Onboarding/index.js +2 -0
  24. package/dist/esm/index.d.ts +2 -0
  25. package/dist/esm/index.js +2 -0
  26. package/dist/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +12 -3
  28. package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +3 -3
  29. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +3 -3
  30. package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +1 -1
  31. package/patternfly-docs/content/extensions/chatbot/examples/Customizing Messages/Customizing Messages.md +1 -1
  32. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +11 -0
  33. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +1 -1
  34. package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactOnboarding.tsx +141 -0
  35. package/patternfly-docs/content/extensions/chatbot/examples/UI/Onboarding.tsx +151 -0
  36. package/patternfly-docs/content/extensions/chatbot/examples/UI/RH-Hat-Image.svg +9 -0
  37. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +38 -20
  38. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +1 -1
  39. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +2 -2
  40. package/patternfly-docs/patternfly-docs.config.js +1 -1
  41. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +56 -14
  42. package/src/ChatbotModal/ChatbotModal.scss +3 -0
  43. package/src/CodeModal/CodeModal.tsx +71 -26
  44. package/src/Onboarding/Onboarding.scss +101 -0
  45. package/src/Onboarding/Onboarding.test.tsx +148 -0
  46. package/src/Onboarding/Onboarding.tsx +126 -0
  47. package/src/Onboarding/index.ts +3 -0
  48. package/src/index.ts +3 -0
  49. package/src/main.scss +1 -0
  50. package/tsconfig.json +1 -1
@@ -1,3 +1,12 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
1
10
  var __rest = (this && this.__rest) || function (s, e) {
2
11
  var t = {};
3
12
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -12,22 +21,45 @@ var __rest = (this && this.__rest) || function (s, e) {
12
21
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
22
  import { useState, useEffect, useRef } from 'react';
14
23
  import path from 'path-browserify';
15
- import * as monaco from 'monaco-editor';
16
- import { loader } from '@monaco-editor/react';
17
24
  // Import PatternFly components
18
25
  import { CodeEditor } from '@patternfly/react-code-editor';
19
- import { Button, getResizeObserver, ModalBody, ModalFooter, ModalHeader, Stack, StackItem } from '@patternfly/react-core';
26
+ import { Bullseye, Button, getResizeObserver, ModalBody, ModalFooter, ModalHeader, Spinner, Stack, StackItem } from '@patternfly/react-core';
20
27
  import FileDetails, { extensionToLanguage } from '../FileDetails';
21
28
  import { ChatbotDisplayMode } from '../Chatbot';
22
29
  import ChatbotModal from '../ChatbotModal/ChatbotModal';
23
- // Configure Monaco loader to use the npm package instead of CDN
24
- loader.config({ monaco });
30
+ // Try to lazy load - some consumers need to be below a certain bundle size, but can't use the CDN and don't have webpack
31
+ let monacoInstance = null;
32
+ const loadMonaco = () => __awaiter(void 0, void 0, void 0, function* () {
33
+ if (!monacoInstance) {
34
+ const [monaco, { loader }] = yield Promise.all([import('monaco-editor'), import('@monaco-editor/react')]);
35
+ monacoInstance = monaco;
36
+ loader.config({ monaco });
37
+ }
38
+ return monacoInstance;
39
+ });
25
40
  export const CodeModal = (_a) => {
26
- var { fileName, code, codeEditorControlClassName: codeEditorClassName, handleModalToggle, isCopyEnabled, isLineNumbersVisible, isModalOpen, isReadOnly, onPrimaryAction, onSecondaryAction, primaryActionBtn, secondaryActionBtn, title, displayMode = ChatbotDisplayMode.default, isCompact, modalHeaderClassName, modalBodyClassName, modalFooterClassName } = _a, props = __rest(_a, ["fileName", "code", "codeEditorControlClassName", "handleModalToggle", "isCopyEnabled", "isLineNumbersVisible", "isModalOpen", "isReadOnly", "onPrimaryAction", "onSecondaryAction", "primaryActionBtn", "secondaryActionBtn", "title", "displayMode", "isCompact", "modalHeaderClassName", "modalBodyClassName", "modalFooterClassName"]);
41
+ var { fileName, code, codeEditorControlClassName: codeEditorClassName, handleModalToggle, isCopyEnabled, isLineNumbersVisible, isModalOpen, isReadOnly, onPrimaryAction, onSecondaryAction, primaryActionBtn, secondaryActionBtn, title, displayMode = ChatbotDisplayMode.default, isCompact, modalHeaderClassName, modalBodyClassName, modalFooterClassName, spinnerAriaLabel = 'Loading' } = _a, props = __rest(_a, ["fileName", "code", "codeEditorControlClassName", "handleModalToggle", "isCopyEnabled", "isLineNumbersVisible", "isModalOpen", "isReadOnly", "onPrimaryAction", "onSecondaryAction", "primaryActionBtn", "secondaryActionBtn", "title", "displayMode", "isCompact", "modalHeaderClassName", "modalBodyClassName", "modalFooterClassName", "spinnerAriaLabel"]);
27
42
  const [newCode, setNewCode] = useState(code);
28
43
  const [editorInstance, setEditorInstance] = useState(null);
29
44
  const [isEditorReady, setIsEditorReady] = useState(false);
45
+ const [isMonacoLoading, setIsMonacoLoading] = useState(false);
46
+ const [isMonacoLoaded, setIsMonacoLoaded] = useState(false);
30
47
  const containerRef = useRef(null);
48
+ useEffect(() => {
49
+ if (isModalOpen && !isMonacoLoaded && !isMonacoLoading) {
50
+ setIsMonacoLoading(true);
51
+ loadMonaco()
52
+ .then(() => {
53
+ setIsMonacoLoaded(true);
54
+ setIsMonacoLoading(false);
55
+ })
56
+ .catch((error) => {
57
+ // eslint-disable-next-line no-console
58
+ console.error('Failed to load Monaco editor:', error);
59
+ setIsMonacoLoading(false);
60
+ });
61
+ }
62
+ }, [isModalOpen, isMonacoLoaded, isMonacoLoading]);
31
63
  useEffect(() => {
32
64
  if (!isModalOpen || !isEditorReady || !editorInstance || !containerRef.current) {
33
65
  return;
@@ -77,13 +109,22 @@ export const CodeModal = (_a) => {
77
109
  setNewCode(value);
78
110
  }
79
111
  };
80
- const modal = (_jsxs(ChatbotModal, { isOpen: isModalOpen, onClose: handleModalToggle, ouiaId: "CodeModal", "aria-labelledby": "code-modal-title", "aria-describedby": "code-modal", className: `pf-chatbot__code-modal ${isCompact ? 'pf-m-compact' : ''} pf-chatbot__code-modal--${displayMode}`, displayMode: displayMode, isCompact: isCompact, children: [_jsx(ModalHeader, { className: modalHeaderClassName, title: title, labelId: "code-modal-title" }), _jsx(ModalBody, { className: modalBodyClassName, id: "code-modal-body", children: _jsxs(Stack, { className: "pf-chatbot__code-modal-body", children: [_jsx(StackItem, { className: "pf-chatbot__code-modal-file-details", children: _jsx(FileDetails, { fileName: fileName }) }), _jsx("div", { className: "pf-v6-l-stack__item pf-chatbot__code-modal-editor", ref: containerRef, children: _jsx(CodeEditor, Object.assign({ isDarkTheme: true, isLineNumbersVisible: isLineNumbersVisible, isLanguageLabelVisible: true, isCopyEnabled: isCopyEnabled, isReadOnly: isReadOnly, code: newCode, language: extensionToLanguage[path.extname(fileName).slice(1)], onEditorDidMount: onEditorDidMount, onCodeChange: onCodeChange, className: codeEditorClassName, isFullHeight: true, options: {
81
- glyphMargin: false,
82
- folding: false,
83
- // prevents Monaco from handling resizing itself
84
- // was causing ResizeObserver issues
85
- automaticLayout: false
86
- } }, props)) })] }) }), _jsxs(ModalFooter, { className: modalFooterClassName, children: [_jsx(Button, { isBlock: true, variant: "primary", onClick: handlePrimaryAction, form: "code-modal-form", children: primaryActionBtn }, "code-modal-primary"), _jsx(Button, { isBlock: true, variant: "link", onClick: handleSecondaryAction, children: secondaryActionBtn }, "code-modal-secondary")] })] }));
112
+ const renderMonacoEditor = () => {
113
+ if (isMonacoLoading) {
114
+ return (_jsx(Bullseye, { children: _jsx(Spinner, { "aria-label": spinnerAriaLabel }) }));
115
+ }
116
+ if (isMonacoLoaded) {
117
+ return (_jsx(CodeEditor, Object.assign({ isDarkTheme: true, isLineNumbersVisible: isLineNumbersVisible, isLanguageLabelVisible: true, isCopyEnabled: isCopyEnabled, isReadOnly: isReadOnly, code: newCode, language: extensionToLanguage[path.extname(fileName).slice(1)], onEditorDidMount: onEditorDidMount, onCodeChange: onCodeChange, className: codeEditorClassName, isFullHeight: true, options: {
118
+ glyphMargin: false,
119
+ folding: false,
120
+ // prevents Monaco from handling resizing itself
121
+ // was causing ResizeObserver issues
122
+ automaticLayout: false
123
+ } }, props)));
124
+ }
125
+ return null;
126
+ };
127
+ const modal = (_jsxs(ChatbotModal, { isOpen: isModalOpen, onClose: handleModalToggle, ouiaId: "CodeModal", "aria-labelledby": "code-modal-title", "aria-describedby": "code-modal", className: `pf-chatbot__code-modal ${isCompact ? 'pf-m-compact' : ''} pf-chatbot__code-modal--${displayMode}`, displayMode: displayMode, isCompact: isCompact, children: [_jsx(ModalHeader, { className: modalHeaderClassName, title: title, labelId: "code-modal-title" }), _jsx(ModalBody, { className: modalBodyClassName, id: "code-modal-body", children: _jsxs(Stack, { className: "pf-chatbot__code-modal-body", children: [_jsx(StackItem, { className: "pf-chatbot__code-modal-file-details", children: _jsx(FileDetails, { fileName: fileName }) }), _jsx("div", { className: "pf-v6-l-stack__item pf-chatbot__code-modal-editor", ref: containerRef, children: renderMonacoEditor() })] }) }), _jsxs(ModalFooter, { className: modalFooterClassName, children: [_jsx(Button, { isBlock: true, variant: "primary", onClick: handlePrimaryAction, form: "code-modal-form", children: primaryActionBtn }, "code-modal-primary"), _jsx(Button, { isBlock: true, variant: "link", onClick: handleSecondaryAction, children: secondaryActionBtn }, "code-modal-secondary")] })] }));
87
128
  return modal;
88
129
  };
89
130
  export default CodeModal;
@@ -0,0 +1,36 @@
1
+ import type { FunctionComponent } from 'react';
2
+ import { ModalProps } from '@patternfly/react-core';
3
+ import { ChatbotDisplayMode } from '../Chatbot';
4
+ export interface OnboardingProps extends ModalProps {
5
+ /** Class applied to modal */
6
+ className?: string;
7
+ /** Action assigned to primary modal button */
8
+ onPrimaryAction?: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
9
+ /** Action assigned to secondary modal button */
10
+ onSecondaryAction: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
11
+ /** Name of primary modal button */
12
+ primaryActionBtn?: string;
13
+ /** Name of secondary modal button */
14
+ secondaryActionBtn?: string;
15
+ /** Function that handles modal toggle */
16
+ handleModalToggle: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
17
+ /** Whether modal is open */
18
+ isModalOpen: boolean;
19
+ /** Title of modal */
20
+ title?: string;
21
+ /** Display mode for the Chatbot parent; this influences the styles applied */
22
+ displayMode?: ChatbotDisplayMode;
23
+ /** Optional image displayed in header */
24
+ headerImage?: string;
25
+ /** Alt text for optional image displayed in header */
26
+ headerImageAltText?: string;
27
+ /** Ref applied to modal */
28
+ innerRef?: React.Ref<HTMLDivElement>;
29
+ /** OuiaID applied to modal */
30
+ ouiaId?: string;
31
+ /** Sets modal to compact styling. */
32
+ isCompact?: boolean;
33
+ }
34
+ export declare const OnboardingBase: FunctionComponent<OnboardingProps>;
35
+ declare const Onboarding: import("react").ForwardRefExoticComponent<Omit<OnboardingProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
36
+ export default Onboarding;
@@ -0,0 +1,30 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
13
+ import { forwardRef } from 'react';
14
+ import { Button, Content, ModalBody, ModalFooter } from '@patternfly/react-core';
15
+ import { ChatbotDisplayMode } from '../Chatbot';
16
+ import ChatbotModal from '../ChatbotModal/ChatbotModal';
17
+ export const OnboardingBase = (_a) => {
18
+ var { handleModalToggle, isModalOpen, onPrimaryAction, onSecondaryAction, primaryActionBtn = 'Continue', secondaryActionBtn = 'Skip', title = 'Onboarding', headerImage, headerImageAltText = '', displayMode = ChatbotDisplayMode.default, className, children, innerRef, ouiaId = 'Onboarding', isCompact } = _a, props = __rest(_a, ["handleModalToggle", "isModalOpen", "onPrimaryAction", "onSecondaryAction", "primaryActionBtn", "secondaryActionBtn", "title", "headerImage", "headerImageAltText", "displayMode", "className", "children", "innerRef", "ouiaId", "isCompact"]);
19
+ const handlePrimaryAction = (_event) => {
20
+ handleModalToggle(_event);
21
+ onPrimaryAction && onPrimaryAction(_event);
22
+ };
23
+ const handleSecondaryAction = (_event) => {
24
+ onSecondaryAction(_event);
25
+ };
26
+ const modal = (_jsx(ChatbotModal, Object.assign({ isOpen: isModalOpen, ouiaId: ouiaId, "aria-labelledby": "onboarding-title", "aria-describedby": "onboarding-modal", className: `pf-chatbot__onboarding-modal pf-chatbot__onboarding-modal--${displayMode} ${isCompact ? 'pf-m-compact' : ''} ${className ? className : ''}`, displayMode: displayMode, onClose: handleModalToggle }, props, { children: _jsx("section", { className: `pf-chatbot__onboarding--section`, "aria-label": title, tabIndex: -1, ref: innerRef, children: _jsxs(_Fragment, { children: [_jsxs(ModalBody, { className: "pf-chatbot__onboarding--modal-body", children: [!isCompact && headerImage && (_jsx("div", { className: "pf-chatbot__onboarding--header", children: _jsx("img", { src: headerImage, className: "pf-chatbot__onboarding--image", alt: headerImageAltText }) })), _jsxs("div", { className: "pf-chatbot__onboarding--modal-text", children: [_jsx("h1", { className: "pf-chatbot__onboarding--title", children: title }), _jsx(Content, { children: children })] })] }), _jsxs(ModalFooter, { className: "pf-chatbot__onboarding--footer", children: [_jsx(Button, { isBlock: true, variant: "primary", onClick: handlePrimaryAction, form: "onboarding-form", size: "lg", children: primaryActionBtn }, "onboarding-modal-primary"), _jsx(Button, { isBlock: true, variant: "secondary", onClick: handleSecondaryAction, size: "lg", children: secondaryActionBtn }, "onboarding-modal-secondary")] })] }) }) })));
27
+ return modal;
28
+ };
29
+ const Onboarding = forwardRef((props, ref) => (_jsx(OnboardingBase, Object.assign({ innerRef: ref }, props))));
30
+ export default Onboarding;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -0,0 +1,75 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ import { render, screen } from '@testing-library/react';
12
+ import '@testing-library/jest-dom';
13
+ import userEvent from '@testing-library/user-event';
14
+ import Onboarding from './Onboarding';
15
+ const handleModalToggle = jest.fn();
16
+ const onPrimaryAction = jest.fn();
17
+ const onSecondaryAction = jest.fn();
18
+ const body = 'Experience personalized assistance and seamless problem-solving, simplifying your journey with Red Hat every step of the way.';
19
+ describe('Onboarding', () => {
20
+ afterEach(() => {
21
+ jest.clearAllMocks();
22
+ });
23
+ it('should render modal correctly', () => {
24
+ render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, ouiaId: "Terms", children: body }));
25
+ expect(screen.getByRole('heading', { name: /Onboarding/i })).toBeTruthy();
26
+ expect(screen.getByRole('button', { name: /Continue/i })).toBeTruthy();
27
+ expect(screen.getByRole('button', { name: /Skip/i })).toBeTruthy();
28
+ expect(screen.getByText(body)).toBeTruthy();
29
+ expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal');
30
+ expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal--default');
31
+ });
32
+ it('should handle image and altText props', () => {
33
+ render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, headerImage: "./image.png", headerImageAltText: "Test image", children: body }));
34
+ expect(screen.getByRole('img')).toBeTruthy();
35
+ expect(screen.getByRole('img')).toHaveAttribute('alt', 'Test image');
36
+ });
37
+ it('should handle className prop', () => {
38
+ render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, className: "test", children: body }));
39
+ expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal');
40
+ expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal--default');
41
+ expect(screen.getByRole('dialog')).toHaveClass('test');
42
+ });
43
+ it('should handle title prop', () => {
44
+ render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, title: "Updated title", children: body }));
45
+ expect(screen.getByRole('heading', { name: /Updated title/i })).toBeTruthy();
46
+ expect(screen.queryByRole('heading', { name: /Onboarding/i })).toBeFalsy();
47
+ });
48
+ it('should handle primary button prop', () => {
49
+ render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, primaryActionBtn: "First", children: body }));
50
+ expect(screen.getByRole('button', { name: /First/i })).toBeTruthy();
51
+ expect(screen.queryByRole('button', { name: /Continue/i })).toBeFalsy();
52
+ });
53
+ it('should handle secondary button prop', () => {
54
+ render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, secondaryActionBtn: "Second", children: body }));
55
+ expect(screen.getByRole('button', { name: /Second/i })).toBeTruthy();
56
+ expect(screen.queryByRole('button', { name: /Skip/i })).toBeFalsy();
57
+ });
58
+ it('should handle primary button click', () => __awaiter(void 0, void 0, void 0, function* () {
59
+ render(_jsx(Onboarding, { isModalOpen: true, onPrimaryAction: onPrimaryAction, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, children: body }));
60
+ yield userEvent.click(screen.getByRole('button', { name: /Continue/i }));
61
+ expect(onPrimaryAction).toHaveBeenCalledTimes(1);
62
+ expect(handleModalToggle).toHaveBeenCalledTimes(1);
63
+ }));
64
+ it('should handle secondary button click', () => __awaiter(void 0, void 0, void 0, function* () {
65
+ render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, children: body }));
66
+ yield userEvent.click(screen.getByRole('button', { name: /Skip/i }));
67
+ expect(onSecondaryAction).toHaveBeenCalledTimes(1);
68
+ expect(handleModalToggle).not.toHaveBeenCalled();
69
+ }));
70
+ it('should handle isCompact prop', () => {
71
+ render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, isCompact: true, headerImage: "./image.png", headerImageAltText: "Test image", children: body }));
72
+ expect(screen.getByRole('dialog')).toHaveClass('pf-m-compact');
73
+ expect(screen.queryByRole('img')).toBeFalsy();
74
+ });
75
+ });
@@ -0,0 +1,2 @@
1
+ export { default } from './Onboarding';
2
+ export * from './Onboarding';
@@ -0,0 +1,2 @@
1
+ export { default } from './Onboarding';
2
+ export * from './Onboarding';
@@ -48,6 +48,8 @@ export { default as MessageBox } from './MessageBox';
48
48
  export * from './MessageBox';
49
49
  export { default as MessageDivider } from './MessageDivider';
50
50
  export * from './MessageDivider';
51
+ export { default as Onboarding } from './Onboarding';
52
+ export * from './Onboarding';
51
53
  export { default as PreviewAttachment } from './PreviewAttachment';
52
54
  export * from './PreviewAttachment';
53
55
  export { default as ResponseActions } from './ResponseActions';
package/dist/esm/index.js CHANGED
@@ -49,6 +49,8 @@ export { default as MessageBox } from './MessageBox';
49
49
  export * from './MessageBox';
50
50
  export { default as MessageDivider } from './MessageDivider';
51
51
  export * from './MessageDivider';
52
+ export { default as Onboarding } from './Onboarding';
53
+ export * from './Onboarding';
52
54
  export { default as PreviewAttachment } from './PreviewAttachment';
53
55
  export * from './PreviewAttachment';
54
56
  export { default as ResponseActions } from './ResponseActions';
@@ -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/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/ImagePreview/ImagePreview.test.tsx","../src/ImagePreview/ImagePreview.tsx","../src/ImagePreview/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/SourcesCardBase/SourcesCardBase.test.tsx","../src/SourcesCardBase/SourcesCardBase.tsx","../src/SourcesCardBase/index.ts","../src/TermsOfUse/TermsOfUse.test.tsx","../src/TermsOfUse/TermsOfUse.tsx","../src/TermsOfUse/index.ts","../src/ToolCall/ToolCall.test.tsx","../src/ToolCall/ToolCall.tsx","../src/ToolCall/index.ts","../src/ToolResponse/ToolResponse.test.tsx","../src/ToolResponse/ToolResponse.tsx","../src/ToolResponse/index.ts","../src/__mocks__/monaco-editor.ts","../src/__mocks__/rehype-external-links.ts","../src/__mocks__/rehype-highlight.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/ImagePreview/ImagePreview.test.tsx","../src/ImagePreview/ImagePreview.tsx","../src/ImagePreview/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/Onboarding/Onboarding.test.tsx","../src/Onboarding/Onboarding.tsx","../src/Onboarding/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/SourcesCardBase/SourcesCardBase.test.tsx","../src/SourcesCardBase/SourcesCardBase.tsx","../src/SourcesCardBase/index.ts","../src/TermsOfUse/TermsOfUse.test.tsx","../src/TermsOfUse/TermsOfUse.tsx","../src/TermsOfUse/index.ts","../src/ToolCall/ToolCall.test.tsx","../src/ToolCall/ToolCall.tsx","../src/ToolCall/index.ts","../src/ToolResponse/ToolResponse.test.tsx","../src/ToolResponse/ToolResponse.tsx","../src/ToolResponse/index.ts","../src/__mocks__/monaco-editor.ts","../src/__mocks__/rehype-external-links.ts","../src/__mocks__/rehype-highlight.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,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/chatbot",
3
- "version": "6.5.0-prerelease.17",
3
+ "version": "6.5.0-prerelease.19",
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",
@@ -36,11 +36,10 @@
36
36
  "@patternfly/react-code-editor": "^6.1.0",
37
37
  "@patternfly/react-core": "^6.1.0",
38
38
  "@patternfly/react-icons": "^6.1.0",
39
- "@patternfly/react-table": "^6.1.0",
40
39
  "@patternfly/react-styles": "^6.1.0",
40
+ "@patternfly/react-table": "^6.1.0",
41
41
  "@segment/analytics-next": "^1.76.0",
42
42
  "clsx": "^2.1.0",
43
- "monaco-editor": "^0.54.0",
44
43
  "path-browserify": "^1.0.1",
45
44
  "posthog-js": "^1.194.4",
46
45
  "react-markdown": "^9.0.1",
@@ -52,9 +51,19 @@
52
51
  "unist-util-visit": "^5.0.0"
53
52
  },
54
53
  "peerDependencies": {
54
+ "@monaco-editor/react": "^4.7.0",
55
+ "monaco-editor": "^0.54.0",
55
56
  "react": "^18 || ^19",
56
57
  "react-dom": "^18 || ^19"
57
58
  },
59
+ "peerDependenciesMeta": {
60
+ "@monaco-editor/react": {
61
+ "optional": false
62
+ },
63
+ "monaco-editor": {
64
+ "optional": false
65
+ }
66
+ },
58
67
  "devDependencies": {
59
68
  "@octokit/rest": "^18.0.0",
60
69
  "@patternfly/documentation-framework": "6.28.9",
@@ -1,5 +1,5 @@
1
1
  ---
2
- section: Extensions
2
+ section: extensions
3
3
  subsection: ChatBot
4
4
  id: Overview
5
5
  sortValue: 1
@@ -8,7 +8,7 @@ source: About
8
8
 
9
9
  **Note:** The PatternFly ChatBot extension lives in its own package [`@patternfly/chatbot`](https://www.npmjs.com/package/@patternfly/chatbot)
10
10
 
11
- It is important to leverage AI in a way that improves the experiences of your users. In alignment with our [AI principles](/patternfly-ai/about-ai#ai-principles) and [ethical design guidelines,](/patternfly-ai/ai-guidelines) we've created this ChatBot extension. The PatternFly ChatBot contains a React implementation of an AI ChatBot, to provide your users with access to convenient and persistent help.
11
+ It is important to leverage AI in a way that improves the experiences of your users. In alignment with our [AI principles](/ai/about-ai#ai-principles) and [ethical design guidelines,](/ai/ai-guidelines) we've created this ChatBot extension. The PatternFly ChatBot contains a React implementation of an AI ChatBot, to provide your users with access to convenient and persistent help.
12
12
 
13
13
  _Only use this ChatBot when it adds value to your users' experiences._ Don't use it simply for the sake of novelty&mdash;your users will only be excited to interact with a new ChatBot feature if it directly helps them reach their goals.
14
14
 
@@ -22,7 +22,7 @@ To illustrate the capabilities of the ChatBot, including more complex interactio
22
22
  - [ChatBot attachments via file upload](/extensions/chatbot/messages/demo#attach-via-upload-button-in-message-bar)
23
23
  - [ChatBot attachments via built-in menu](/extensions/chatbot/messages/demo#attach-via-menu-of-options-in-message-bar)
24
24
 
25
- To learn how to write for ChatBot experiences, refer to our [conversation design guidelines](/patternfly-ai/conversation-design/#writing-for-chatbots).
25
+ To learn how to write for ChatBot experiences, refer to our [conversation design guidelines](/ai/conversation-design/#writing-for-chatbots).
26
26
 
27
27
  To learn how to design ChatBot experiences, [refer to the design guidelines](/extensions/chatbot/overview/design-guidelines).
28
28
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- section: Extensions
2
+ section: extensions
3
3
  subsection: ChatBot
4
4
  id: Overview
5
5
  sortValue: 1
@@ -351,7 +351,7 @@ Choose the download action location that best works for your ChatBot:
351
351
 
352
352
  #### Download via conversation history drawer
353
353
 
354
- If your ChatBot uses a conversation history drawer, you can provide a download option in the [actions menu linked to a previous conversation](/patternfly-ai/chatbot/ui#drawer-with-conversation-actions).
354
+ If your ChatBot uses a conversation history drawer, you can provide a download option in the [actions menu linked to a previous conversation](/extensions/chatbot/ui#drawer-with-conversation-actions).
355
355
 
356
356
  <div class="ws-docs-content-img">
357
357
  ![Expanded menu for previous chat in the history window, which shows a download option.](./img/download-chat-history.svg)
@@ -429,7 +429,7 @@ Refer to the additional guidelines for [accessing a ChatBot](#accessing-a-chatbo
429
429
 
430
430
  ## Content considerations
431
431
 
432
- For guidance on writing ChatBot content, refer to our [conversation design guidelines](/patternfly-ai/conversation-design).
432
+ For guidance on writing ChatBot content, refer to our [conversation design guidelines](/ai/conversation-design).
433
433
 
434
434
  ## Accessibility
435
435
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  # Sidenav top-level section
3
3
  # should be the same for all markdown files
4
- section: Extensions
4
+ section: extensions
5
5
  subsection: ChatBot
6
6
  # Sidenav secondary level section
7
7
  # should be the same for all markdown files
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  # Sidenav top-level section
3
3
  # should be the same for all markdown files
4
- section: Extensions
4
+ section: extensions
5
5
  subsection: ChatBot
6
6
  # Sidenav secondary level section
7
7
  # should be the same for all markdown files
@@ -1,6 +1,7 @@
1
1
  import { FunctionComponent } from 'react';
2
2
  import Message from '@patternfly/chatbot/dist/dynamic/Message';
3
3
  import patternflyAvatar from './patternfly_avatar.jpg';
4
+ import { CopyIcon, WrenchIcon } from '@patternfly/react-icons';
4
5
 
5
6
  export const MessageWithQuickResponsesExample: FunctionComponent = () => (
6
7
  <>
@@ -74,5 +75,15 @@ export const MessageWithQuickResponsesExample: FunctionComponent = () => (
74
75
  ]}
75
76
  isCompact
76
77
  />
78
+ <Message
79
+ name="Bot"
80
+ role="bot"
81
+ avatar={patternflyAvatar}
82
+ content="Example with icons"
83
+ quickResponses={[
84
+ { id: '1', content: 'Update your settings', onClick: () => alert('Clicked yes'), icon: <WrenchIcon /> },
85
+ { id: '2', content: 'Copy', onClick: () => alert('Clicked no'), icon: <CopyIcon /> }
86
+ ]}
87
+ />
77
88
  </>
78
89
  );
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  # Sidenav top-level section
3
3
  # should be the same for all markdown files
4
- section: Extensions
4
+ section: extensions
5
5
  subsection: ChatBot
6
6
  # Sidenav secondary level section
7
7
  # should be the same for all markdown files
@@ -0,0 +1,141 @@
1
+ import {
2
+ useRef,
3
+ useState,
4
+ FunctionComponent,
5
+ MouseEvent,
6
+ CSSProperties,
7
+ Ref,
8
+ MouseEvent as ReactMouseEvent
9
+ } from 'react';
10
+ import {
11
+ Button,
12
+ SkipToContent,
13
+ MenuToggle,
14
+ MenuToggleElement,
15
+ Select,
16
+ SelectList,
17
+ SelectOption,
18
+ Stack
19
+ } from '@patternfly/react-core';
20
+ import Onboarding from '@patternfly/chatbot/dist/dynamic/Onboarding';
21
+ import Chatbot, { ChatbotDisplayMode } from '@patternfly/chatbot/dist/dynamic/Chatbot';
22
+
23
+ export const OnboardingExample: FunctionComponent = () => {
24
+ const [isModalOpen, setIsModalOpen] = useState(true);
25
+ const [displayMode, setDisplayMode] = useState(ChatbotDisplayMode.default);
26
+ const chatbotRef = useRef<HTMLDivElement>(null);
27
+ const termsRef = useRef<HTMLDivElement>(null);
28
+ const [isOpen, setIsOpen] = useState(false);
29
+ const [selected, setSelected] = useState<string>('Select display mode');
30
+
31
+ const handleSkipToContent = (e) => {
32
+ e.preventDefault();
33
+ if (!isModalOpen && chatbotRef.current) {
34
+ chatbotRef.current.focus();
35
+ }
36
+ if (isModalOpen && termsRef.current) {
37
+ termsRef.current.focus();
38
+ }
39
+ };
40
+
41
+ const handleModalToggle = (_event: MouseEvent | MouseEvent | KeyboardEvent) => {
42
+ setIsModalOpen(!isModalOpen);
43
+ };
44
+
45
+ const onPrimaryAction = () => {
46
+ // eslint-disable-next-line no-console
47
+ console.log('Clicked primary action');
48
+ };
49
+
50
+ const onSecondaryAction = () => {
51
+ // eslint-disable-next-line no-console
52
+ console.log('Clicked secondary action');
53
+ };
54
+ const onSelect = (_event: ReactMouseEvent<Element, MouseEvent> | undefined, value: string | number | undefined) => {
55
+ setSelected(value as string);
56
+ setIsOpen(false);
57
+ if (value === 'Default') {
58
+ setDisplayMode(ChatbotDisplayMode.default);
59
+ }
60
+ if (value === 'Docked') {
61
+ setDisplayMode(ChatbotDisplayMode.docked);
62
+ }
63
+ if (value === 'Fullscreen') {
64
+ setDisplayMode(ChatbotDisplayMode.fullscreen);
65
+ }
66
+ if (value === 'Embedded') {
67
+ setDisplayMode(ChatbotDisplayMode.embedded);
68
+ }
69
+ };
70
+
71
+ const onToggleClick = () => {
72
+ setIsOpen(!isOpen);
73
+ };
74
+
75
+ const toggle = (toggleRef: Ref<MenuToggleElement>) => (
76
+ <MenuToggle
77
+ ref={toggleRef}
78
+ onClick={onToggleClick}
79
+ isExpanded={isOpen}
80
+ style={
81
+ {
82
+ width: '200px'
83
+ } as CSSProperties
84
+ }
85
+ aria-label={selected === 'Select display mode' ? 'Select display mode' : `Display mode, ${selected}`}
86
+ >
87
+ {selected}
88
+ </MenuToggle>
89
+ );
90
+
91
+ const body = 'Simplify your Red Hat journey with personalized assistance and seamless problem-solving.';
92
+
93
+ return (
94
+ <>
95
+ <SkipToContent style={{ zIndex: '999' }} onClick={handleSkipToContent} href="#">
96
+ Skip to chatbot
97
+ </SkipToContent>
98
+ <div
99
+ style={{
100
+ position: 'fixed',
101
+ padding: 'var(--pf-t--global--spacer--lg)',
102
+ zIndex: '601',
103
+ boxShadow: 'var(--pf-t--global--box-shadow--lg)'
104
+ }}
105
+ >
106
+ <Stack hasGutter>
107
+ <Select
108
+ id="single-select"
109
+ isOpen={isOpen}
110
+ selected={selected}
111
+ onSelect={onSelect}
112
+ onOpenChange={(isOpen) => setIsOpen(isOpen)}
113
+ toggle={toggle}
114
+ shouldFocusToggleOnSelect
115
+ >
116
+ <SelectList>
117
+ <SelectOption value="Default">Default</SelectOption>
118
+ <SelectOption value="Docked">Docked</SelectOption>
119
+ <SelectOption value="Fullscreen">Fullscreen</SelectOption>
120
+ <SelectOption value="Embedded">Embedded</SelectOption>
121
+ </SelectList>
122
+ </Select>
123
+ <Button onClick={handleModalToggle}>Toggle modal</Button>
124
+ </Stack>
125
+ </div>
126
+ <Chatbot ref={chatbotRef} displayMode={displayMode} isVisible isCompact></Chatbot>
127
+ <Onboarding
128
+ ref={termsRef}
129
+ displayMode={displayMode}
130
+ isModalOpen={isModalOpen}
131
+ handleModalToggle={handleModalToggle}
132
+ onPrimaryAction={onPrimaryAction}
133
+ onSecondaryAction={onSecondaryAction}
134
+ title="Redefine work in the age of AI"
135
+ isCompact
136
+ >
137
+ {body}
138
+ </Onboarding>
139
+ </>
140
+ );
141
+ };