instantsearch-ui-components 0.11.2 → 0.12.0
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/components/Button.js +29 -0
- package/dist/cjs/components/Carousel.js +26 -6
- package/dist/cjs/components/autocomplete/Autocomplete.js +23 -0
- package/dist/cjs/components/autocomplete/AutocompleteIndex.js +39 -0
- package/dist/cjs/components/autocomplete/AutocompletePanel.js +25 -0
- package/dist/cjs/components/autocomplete/AutocompleteSuggestion.js +20 -0
- package/dist/cjs/components/autocomplete/index.js +49 -0
- package/dist/cjs/components/chat/Chat.js +79 -0
- package/dist/cjs/components/chat/ChatHeader.js +89 -0
- package/dist/cjs/components/chat/ChatMessage.js +138 -0
- package/dist/cjs/components/chat/ChatMessageError.js +57 -0
- package/dist/cjs/components/chat/ChatMessageLoader.js +47 -0
- package/dist/cjs/components/chat/ChatMessages.js +192 -0
- package/dist/cjs/components/chat/ChatPrompt.js +179 -0
- package/dist/cjs/components/chat/ChatToggleButton.js +46 -0
- package/dist/cjs/components/chat/icons.js +375 -0
- package/dist/cjs/components/chat/types.js +1 -0
- package/dist/cjs/components/index.js +132 -0
- package/dist/cjs/lib/index.js +22 -0
- package/dist/cjs/lib/stickToBottom.js +481 -0
- package/dist/cjs/lib/utils/find.js +15 -0
- package/dist/cjs/lib/utils/index.js +27 -0
- package/dist/cjs/lib/utils/startsWith.js +9 -0
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/warn.js +40 -0
- package/dist/es/components/Button.d.ts +38 -0
- package/dist/es/components/Button.js +22 -0
- package/dist/es/components/Carousel.d.ts +11 -0
- package/dist/es/components/Carousel.js +26 -6
- package/dist/es/components/autocomplete/Autocomplete.d.ts +13 -0
- package/dist/es/components/autocomplete/Autocomplete.js +16 -0
- package/dist/es/components/autocomplete/AutocompleteIndex.d.ts +31 -0
- package/dist/es/components/autocomplete/AutocompleteIndex.js +32 -0
- package/dist/es/components/autocomplete/AutocompletePanel.d.ts +17 -0
- package/dist/es/components/autocomplete/AutocompletePanel.js +18 -0
- package/dist/es/components/autocomplete/AutocompleteSuggestion.d.ts +16 -0
- package/dist/es/components/autocomplete/AutocompleteSuggestion.js +14 -0
- package/dist/es/components/autocomplete/index.d.ts +4 -0
- package/dist/es/components/autocomplete/index.js +4 -0
- package/dist/es/components/chat/Chat.d.ts +42 -0
- package/dist/es/components/chat/Chat.js +72 -0
- package/dist/es/components/chat/ChatHeader.d.ts +99 -0
- package/dist/es/components/chat/ChatHeader.js +82 -0
- package/dist/es/components/chat/ChatMessage.d.ts +124 -0
- package/dist/es/components/chat/ChatMessage.js +131 -0
- package/dist/es/components/chat/ChatMessageError.d.ts +27 -0
- package/dist/es/components/chat/ChatMessageError.js +50 -0
- package/dist/es/components/chat/ChatMessageLoader.d.ts +15 -0
- package/dist/es/components/chat/ChatMessageLoader.js +40 -0
- package/dist/es/components/chat/ChatMessages.d.ts +139 -0
- package/dist/es/components/chat/ChatMessages.js +185 -0
- package/dist/es/components/chat/ChatPrompt.d.ts +119 -0
- package/dist/es/components/chat/ChatPrompt.js +172 -0
- package/dist/es/components/chat/ChatToggleButton.d.ts +29 -0
- package/dist/es/components/chat/ChatToggleButton.js +39 -0
- package/dist/es/components/chat/icons.d.ts +22 -0
- package/dist/es/components/chat/icons.js +355 -0
- package/dist/es/components/chat/types.d.ts +29 -0
- package/dist/es/components/chat/types.js +1 -0
- package/dist/es/components/index.d.ts +12 -0
- package/dist/es/components/index.js +12 -0
- package/dist/es/lib/index.d.ts +2 -0
- package/dist/es/lib/index.js +3 -1
- package/dist/es/lib/stickToBottom.d.ts +114 -0
- package/dist/es/lib/stickToBottom.js +474 -0
- package/dist/es/lib/utils/find.d.ts +1 -0
- package/dist/es/lib/utils/find.js +9 -0
- package/dist/es/lib/utils/index.d.ts +2 -0
- package/dist/es/lib/utils/index.js +2 -0
- package/dist/es/lib/utils/startsWith.d.ts +1 -0
- package/dist/es/lib/utils/startsWith.js +3 -0
- package/dist/es/types/Renderer.d.ts +1 -1
- package/dist/es/version.d.ts +1 -1
- package/dist/es/version.js +1 -1
- package/dist/es/warn.d.ts +10 -0
- package/dist/es/warn.js +33 -0
- package/package.json +7 -3
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
3
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
4
|
+
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
5
|
+
var _excluded = ["classNames", "messages", "messageComponent", "loaderComponent", "errorComponent", "actionsComponent", "tools", "indexUiState", "setIndexUiState", "status", "hideScrollToBottom", "onReload", "onClose", "translations", "userMessageProps", "assistantMessageProps", "isClearing", "onClearTransitionEnd", "isScrollAtBottom", "scrollRef", "contentRef", "onScrollToBottom"];
|
|
6
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
7
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
8
|
+
import { cx } from "../../lib/index.js";
|
|
9
|
+
import { createButtonComponent } from "../Button.js";
|
|
10
|
+
import { createChatMessageComponent } from "./ChatMessage.js";
|
|
11
|
+
import { createChatMessageErrorComponent } from "./ChatMessageError.js";
|
|
12
|
+
import { createChatMessageLoaderComponent } from "./ChatMessageLoader.js";
|
|
13
|
+
import { ChevronDownIconComponent, CopyIconComponent, ReloadIconComponent } from "./icons.js";
|
|
14
|
+
var getTextContent = function getTextContent(message) {
|
|
15
|
+
return message.parts.map(function (part) {
|
|
16
|
+
return 'text' in part ? part.text : '';
|
|
17
|
+
}).join('');
|
|
18
|
+
};
|
|
19
|
+
var hasTextContent = function hasTextContent(message) {
|
|
20
|
+
return getTextContent(message).trim() !== '';
|
|
21
|
+
};
|
|
22
|
+
var copyToClipboard = function copyToClipboard(message) {
|
|
23
|
+
navigator.clipboard.writeText(getTextContent(message));
|
|
24
|
+
};
|
|
25
|
+
function createDefaultMessageComponent(_ref) {
|
|
26
|
+
var createElement = _ref.createElement,
|
|
27
|
+
Fragment = _ref.Fragment;
|
|
28
|
+
var ChatMessage = createChatMessageComponent({
|
|
29
|
+
createElement: createElement,
|
|
30
|
+
Fragment: Fragment
|
|
31
|
+
});
|
|
32
|
+
return function DefaultMessage(_ref2) {
|
|
33
|
+
var message = _ref2.message,
|
|
34
|
+
userMessageProps = _ref2.userMessageProps,
|
|
35
|
+
assistantMessageProps = _ref2.assistantMessageProps,
|
|
36
|
+
tools = _ref2.tools,
|
|
37
|
+
indexUiState = _ref2.indexUiState,
|
|
38
|
+
setIndexUiState = _ref2.setIndexUiState,
|
|
39
|
+
onReload = _ref2.onReload,
|
|
40
|
+
onClose = _ref2.onClose,
|
|
41
|
+
translations = _ref2.translations,
|
|
42
|
+
actionsComponent = _ref2.actionsComponent;
|
|
43
|
+
var defaultAssistantActions = [].concat(_toConsumableArray(hasTextContent(message) ? [{
|
|
44
|
+
title: translations.copyToClipboardLabel,
|
|
45
|
+
icon: function icon() {
|
|
46
|
+
return createElement(CopyIconComponent, {
|
|
47
|
+
createElement: createElement
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
onClick: copyToClipboard
|
|
51
|
+
}] : []), [{
|
|
52
|
+
title: translations.regenerateLabel,
|
|
53
|
+
icon: function icon() {
|
|
54
|
+
return createElement(ReloadIconComponent, {
|
|
55
|
+
createElement: createElement
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
onClick: function onClick(m) {
|
|
59
|
+
return onReload(m.id);
|
|
60
|
+
}
|
|
61
|
+
}]);
|
|
62
|
+
var messageProps = message.role === 'user' ? userMessageProps : assistantMessageProps;
|
|
63
|
+
var defaultActions = message.role === 'user' ? undefined : defaultAssistantActions;
|
|
64
|
+
return createElement(ChatMessage, _extends({
|
|
65
|
+
side: message.role === 'user' ? 'right' : 'left',
|
|
66
|
+
variant: message.role === 'user' ? 'neutral' : 'subtle',
|
|
67
|
+
message: message,
|
|
68
|
+
tools: tools,
|
|
69
|
+
indexUiState: indexUiState,
|
|
70
|
+
setIndexUiState: setIndexUiState,
|
|
71
|
+
onClose: onClose,
|
|
72
|
+
actions: defaultActions,
|
|
73
|
+
actionsComponent: actionsComponent,
|
|
74
|
+
"data-role": message.role
|
|
75
|
+
}, messageProps));
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function createChatMessagesComponent(_ref3) {
|
|
79
|
+
var createElement = _ref3.createElement,
|
|
80
|
+
Fragment = _ref3.Fragment;
|
|
81
|
+
var Button = createButtonComponent({
|
|
82
|
+
createElement: createElement
|
|
83
|
+
});
|
|
84
|
+
var DefaultMessageComponent = createDefaultMessageComponent({
|
|
85
|
+
createElement: createElement,
|
|
86
|
+
Fragment: Fragment
|
|
87
|
+
});
|
|
88
|
+
var DefaultLoaderComponent = createChatMessageLoaderComponent({
|
|
89
|
+
createElement: createElement
|
|
90
|
+
});
|
|
91
|
+
var DefaultErrorComponent = createChatMessageErrorComponent({
|
|
92
|
+
createElement: createElement
|
|
93
|
+
});
|
|
94
|
+
return function ChatMessages(userProps) {
|
|
95
|
+
var _userProps$classNames = userProps.classNames,
|
|
96
|
+
classNames = _userProps$classNames === void 0 ? {} : _userProps$classNames,
|
|
97
|
+
_userProps$messages = userProps.messages,
|
|
98
|
+
messages = _userProps$messages === void 0 ? [] : _userProps$messages,
|
|
99
|
+
MessageComponent = userProps.messageComponent,
|
|
100
|
+
LoaderComponent = userProps.loaderComponent,
|
|
101
|
+
ErrorComponent = userProps.errorComponent,
|
|
102
|
+
ActionsComponent = userProps.actionsComponent,
|
|
103
|
+
tools = userProps.tools,
|
|
104
|
+
indexUiState = userProps.indexUiState,
|
|
105
|
+
setIndexUiState = userProps.setIndexUiState,
|
|
106
|
+
_userProps$status = userProps.status,
|
|
107
|
+
status = _userProps$status === void 0 ? 'ready' : _userProps$status,
|
|
108
|
+
_userProps$hideScroll = userProps.hideScrollToBottom,
|
|
109
|
+
hideScrollToBottom = _userProps$hideScroll === void 0 ? false : _userProps$hideScroll,
|
|
110
|
+
onReload = userProps.onReload,
|
|
111
|
+
onClose = userProps.onClose,
|
|
112
|
+
userTranslations = userProps.translations,
|
|
113
|
+
userMessageProps = userProps.userMessageProps,
|
|
114
|
+
assistantMessageProps = userProps.assistantMessageProps,
|
|
115
|
+
_userProps$isClearing = userProps.isClearing,
|
|
116
|
+
isClearing = _userProps$isClearing === void 0 ? false : _userProps$isClearing,
|
|
117
|
+
onClearTransitionEnd = userProps.onClearTransitionEnd,
|
|
118
|
+
isScrollAtBottom = userProps.isScrollAtBottom,
|
|
119
|
+
scrollRef = userProps.scrollRef,
|
|
120
|
+
contentRef = userProps.contentRef,
|
|
121
|
+
onScrollToBottom = userProps.onScrollToBottom,
|
|
122
|
+
props = _objectWithoutProperties(userProps, _excluded);
|
|
123
|
+
var translations = _objectSpread({
|
|
124
|
+
scrollToBottomLabel: 'Scroll to bottom',
|
|
125
|
+
copyToClipboardLabel: 'Copy to clipboard',
|
|
126
|
+
regenerateLabel: 'Regenerate'
|
|
127
|
+
}, userTranslations);
|
|
128
|
+
var cssClasses = {
|
|
129
|
+
root: cx('ais-ChatMessages', classNames.root),
|
|
130
|
+
scroll: cx('ais-ChatMessages-scroll ais-Scrollbar', classNames.scroll),
|
|
131
|
+
content: cx('ais-ChatMessages-content', classNames.content),
|
|
132
|
+
scrollToBottom: cx('ais-ChatMessages-scrollToBottom', classNames.scrollToBottom),
|
|
133
|
+
scrollToBottomHidden: cx('ais-ChatMessages-scrollToBottom--hidden', classNames.scrollToBottomHidden)
|
|
134
|
+
};
|
|
135
|
+
var DefaultMessage = MessageComponent || DefaultMessageComponent;
|
|
136
|
+
var DefaultLoader = LoaderComponent || DefaultLoaderComponent;
|
|
137
|
+
var DefaultError = ErrorComponent || DefaultErrorComponent;
|
|
138
|
+
return createElement("div", _extends({}, props, {
|
|
139
|
+
className: cx(cssClasses.root, props.className),
|
|
140
|
+
role: "log",
|
|
141
|
+
"aria-live": "polite"
|
|
142
|
+
}), createElement("div", {
|
|
143
|
+
className: cx(cssClasses.scroll),
|
|
144
|
+
ref: scrollRef
|
|
145
|
+
}, createElement("div", {
|
|
146
|
+
className: cx(cssClasses.content, isClearing && 'ais-ChatMessages-content--clearing'),
|
|
147
|
+
ref: contentRef,
|
|
148
|
+
onTransitionEnd: function onTransitionEnd(e) {
|
|
149
|
+
if (e.target === e.currentTarget && e.propertyName === 'opacity' && isClearing) {
|
|
150
|
+
onClearTransitionEnd === null || onClearTransitionEnd === void 0 ? void 0 : onClearTransitionEnd();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}, messages.map(function (message) {
|
|
154
|
+
return createElement(DefaultMessage, {
|
|
155
|
+
key: message.id,
|
|
156
|
+
message: message,
|
|
157
|
+
userMessageProps: userMessageProps,
|
|
158
|
+
assistantMessageProps: assistantMessageProps,
|
|
159
|
+
tools: tools,
|
|
160
|
+
indexUiState: indexUiState,
|
|
161
|
+
setIndexUiState: setIndexUiState,
|
|
162
|
+
onReload: onReload,
|
|
163
|
+
actionsComponent: ActionsComponent,
|
|
164
|
+
onClose: onClose,
|
|
165
|
+
translations: translations
|
|
166
|
+
});
|
|
167
|
+
}), status === 'submitted' && createElement(DefaultLoader, {
|
|
168
|
+
translations: {
|
|
169
|
+
loaderText: translations.loaderText
|
|
170
|
+
}
|
|
171
|
+
}), status === 'error' && createElement(DefaultError, {
|
|
172
|
+
onReload: onReload
|
|
173
|
+
}))), createElement(Button, {
|
|
174
|
+
variant: "outline",
|
|
175
|
+
size: "sm",
|
|
176
|
+
iconOnly: true,
|
|
177
|
+
className: cx(cssClasses.scrollToBottom, (hideScrollToBottom || isScrollAtBottom) && cssClasses.scrollToBottomHidden),
|
|
178
|
+
onClick: onScrollToBottom,
|
|
179
|
+
"aria-label": translations.scrollToBottomLabel,
|
|
180
|
+
tabIndex: isScrollAtBottom ? -1 : 0
|
|
181
|
+
}, createElement(ChevronDownIconComponent, {
|
|
182
|
+
createElement: createElement
|
|
183
|
+
})));
|
|
184
|
+
};
|
|
185
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/** @jsx createElement */
|
|
2
|
+
import type { ComponentProps, MutableRef, Renderer } from '../../types';
|
|
3
|
+
import type { ChatStatus } from './types';
|
|
4
|
+
export type ChatPromptTranslations = {
|
|
5
|
+
/**
|
|
6
|
+
* The label for the textarea
|
|
7
|
+
*/
|
|
8
|
+
textareaLabel: string;
|
|
9
|
+
/**
|
|
10
|
+
* The placeholder text for the textarea
|
|
11
|
+
*/
|
|
12
|
+
textareaPlaceholder: string;
|
|
13
|
+
/**
|
|
14
|
+
* The tooltip for the submit button when message is empty
|
|
15
|
+
*/
|
|
16
|
+
emptyMessageTooltip: string;
|
|
17
|
+
/**
|
|
18
|
+
* The tooltip for the stop button
|
|
19
|
+
*/
|
|
20
|
+
stopResponseTooltip: string;
|
|
21
|
+
/**
|
|
22
|
+
* The tooltip for the send button
|
|
23
|
+
*/
|
|
24
|
+
sendMessageTooltip: string;
|
|
25
|
+
/**
|
|
26
|
+
* The disclaimer text shown in the footer
|
|
27
|
+
*/
|
|
28
|
+
disclaimer: string;
|
|
29
|
+
};
|
|
30
|
+
export type ChatPromptClassNames = {
|
|
31
|
+
/**
|
|
32
|
+
* Class names to apply to the root element
|
|
33
|
+
*/
|
|
34
|
+
root: string | string[];
|
|
35
|
+
/**
|
|
36
|
+
* Class names to apply to the header element
|
|
37
|
+
*/
|
|
38
|
+
header: string | string[];
|
|
39
|
+
/**
|
|
40
|
+
* Class names to apply to the body element
|
|
41
|
+
*/
|
|
42
|
+
body: string | string[];
|
|
43
|
+
/**
|
|
44
|
+
* Class names to apply to the textarea element
|
|
45
|
+
*/
|
|
46
|
+
textarea: string | string[];
|
|
47
|
+
/**
|
|
48
|
+
* Class names to apply to the actions container
|
|
49
|
+
*/
|
|
50
|
+
actions: string | string[];
|
|
51
|
+
/**
|
|
52
|
+
* Class names to apply to the submit button
|
|
53
|
+
*/
|
|
54
|
+
submit: string | string[];
|
|
55
|
+
/**
|
|
56
|
+
* Class names to apply to the footer element
|
|
57
|
+
*/
|
|
58
|
+
footer: string | string[];
|
|
59
|
+
};
|
|
60
|
+
export type ChatPromptOwnProps = {
|
|
61
|
+
/**
|
|
62
|
+
* Content to render above the textarea
|
|
63
|
+
*/
|
|
64
|
+
headerComponent?: () => JSX.Element;
|
|
65
|
+
/**
|
|
66
|
+
* Content to render below the textarea
|
|
67
|
+
*/
|
|
68
|
+
footerComponent?: () => JSX.Element;
|
|
69
|
+
/**
|
|
70
|
+
* The current value of the textarea
|
|
71
|
+
*/
|
|
72
|
+
value?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Placeholder text for the textarea
|
|
75
|
+
*/
|
|
76
|
+
placeholder?: string;
|
|
77
|
+
/**
|
|
78
|
+
* The current status of the chat prompt
|
|
79
|
+
*/
|
|
80
|
+
status?: ChatStatus;
|
|
81
|
+
/**
|
|
82
|
+
* Whether the component is disabled
|
|
83
|
+
*/
|
|
84
|
+
disabled?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Maximum number of rows for the textarea
|
|
87
|
+
*/
|
|
88
|
+
maxRows?: number;
|
|
89
|
+
/**
|
|
90
|
+
* Whether to auto-focus the textarea when mounted
|
|
91
|
+
*/
|
|
92
|
+
autoFocus?: boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Optional class names
|
|
95
|
+
*/
|
|
96
|
+
classNames?: Partial<ChatPromptClassNames>;
|
|
97
|
+
/**
|
|
98
|
+
* Optional translations
|
|
99
|
+
*/
|
|
100
|
+
translations?: Partial<ChatPromptTranslations>;
|
|
101
|
+
/**
|
|
102
|
+
* Callback when the stop button is clicked
|
|
103
|
+
*/
|
|
104
|
+
onStop?: () => void;
|
|
105
|
+
/**
|
|
106
|
+
* Callback when the form is submitted
|
|
107
|
+
*/
|
|
108
|
+
onSubmit?: ComponentProps<'textarea'>['onSubmit'];
|
|
109
|
+
/**
|
|
110
|
+
* Callback when the textarea value changes
|
|
111
|
+
*/
|
|
112
|
+
onInput?: ComponentProps<'textarea'>['onInput'];
|
|
113
|
+
/**
|
|
114
|
+
* Ref to the prompt textarea element for focus management
|
|
115
|
+
*/
|
|
116
|
+
promptRef?: MutableRef<HTMLTextAreaElement | null>;
|
|
117
|
+
};
|
|
118
|
+
export type ChatPromptProps = Omit<ComponentProps<'textarea'>, 'onInput' | 'onSubmit'> & ChatPromptOwnProps;
|
|
119
|
+
export declare function createChatPromptComponent({ createElement }: Renderer): (userProps: ChatPromptProps) => JSX.Element;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
4
|
+
var _excluded = ["classNames", "headerComponent", "footerComponent", "value", "placeholder", "status", "disabled", "maxRows", "autoFocus", "translations", "onInput", "onSubmit", "onKeyDown", "onStop", "promptRef"];
|
|
5
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
|
+
import { cx } from "../../lib/index.js";
|
|
8
|
+
import { createButtonComponent } from "../Button.js";
|
|
9
|
+
import { ArrowUpIconComponent, StopIconComponent } from "./icons.js";
|
|
10
|
+
export function createChatPromptComponent(_ref) {
|
|
11
|
+
var createElement = _ref.createElement;
|
|
12
|
+
var Button = createButtonComponent({
|
|
13
|
+
createElement: createElement
|
|
14
|
+
});
|
|
15
|
+
var textAreaElement = null;
|
|
16
|
+
var lineHeight = 0;
|
|
17
|
+
var padding = 0;
|
|
18
|
+
var adjustHeight = function adjustHeight() {
|
|
19
|
+
if (!textAreaElement) return;
|
|
20
|
+
textAreaElement.style.height = 'auto';
|
|
21
|
+
var fullHeight = textAreaElement.scrollHeight;
|
|
22
|
+
if (textAreaElement.getAttribute('data-max-rows')) {
|
|
23
|
+
var maxRows = parseInt(textAreaElement.getAttribute('data-max-rows') || '0', 10);
|
|
24
|
+
if (maxRows > 0) {
|
|
25
|
+
var maxHeight = maxRows * lineHeight + padding;
|
|
26
|
+
textAreaElement.style.overflowY = fullHeight > maxHeight ? 'auto' : 'hidden';
|
|
27
|
+
textAreaElement.style.height = "".concat(Math.min(fullHeight, maxHeight), "px");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
textAreaElement.style.overflowY = 'hidden';
|
|
32
|
+
textAreaElement.style.height = "".concat(fullHeight, "px");
|
|
33
|
+
};
|
|
34
|
+
var setTextAreaRef = function setTextAreaRef(element, promptRef) {
|
|
35
|
+
textAreaElement = element;
|
|
36
|
+
if (promptRef) {
|
|
37
|
+
promptRef.current = element;
|
|
38
|
+
}
|
|
39
|
+
if (element) {
|
|
40
|
+
var styles = getComputedStyle(element);
|
|
41
|
+
lineHeight = parseFloat(styles.lineHeight);
|
|
42
|
+
var pt = parseFloat(styles.paddingTop);
|
|
43
|
+
var pb = parseFloat(styles.paddingBottom);
|
|
44
|
+
padding = pt + pb;
|
|
45
|
+
adjustHeight();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return function ChatPrompt(userProps) {
|
|
49
|
+
var _userProps$classNames = userProps.classNames,
|
|
50
|
+
classNames = _userProps$classNames === void 0 ? {} : _userProps$classNames,
|
|
51
|
+
HeaderComponent = userProps.headerComponent,
|
|
52
|
+
FooterComponent = userProps.footerComponent,
|
|
53
|
+
value = userProps.value,
|
|
54
|
+
placeholder = userProps.placeholder,
|
|
55
|
+
_userProps$status = userProps.status,
|
|
56
|
+
status = _userProps$status === void 0 ? 'ready' : _userProps$status,
|
|
57
|
+
_userProps$disabled = userProps.disabled,
|
|
58
|
+
disabled = _userProps$disabled === void 0 ? false : _userProps$disabled,
|
|
59
|
+
_userProps$maxRows = userProps.maxRows,
|
|
60
|
+
maxRows = _userProps$maxRows === void 0 ? 5 : _userProps$maxRows,
|
|
61
|
+
_userProps$autoFocus = userProps.autoFocus,
|
|
62
|
+
autoFocus = _userProps$autoFocus === void 0 ? true : _userProps$autoFocus,
|
|
63
|
+
userTranslations = userProps.translations,
|
|
64
|
+
_onInput = userProps.onInput,
|
|
65
|
+
_onSubmit = userProps.onSubmit,
|
|
66
|
+
_onKeyDown = userProps.onKeyDown,
|
|
67
|
+
onStop = userProps.onStop,
|
|
68
|
+
promptRef = userProps.promptRef,
|
|
69
|
+
props = _objectWithoutProperties(userProps, _excluded);
|
|
70
|
+
var translations = _objectSpread({
|
|
71
|
+
textareaLabel: 'Type your message...',
|
|
72
|
+
textareaPlaceholder: 'Type your message...',
|
|
73
|
+
emptyMessageTooltip: 'Message is empty',
|
|
74
|
+
stopResponseTooltip: 'Stop response',
|
|
75
|
+
sendMessageTooltip: 'Send message',
|
|
76
|
+
disclaimer: 'AI can make mistakes. Verify responses.'
|
|
77
|
+
}, userTranslations);
|
|
78
|
+
var cssClasses = {
|
|
79
|
+
root: cx('ais-ChatPrompt', classNames.root),
|
|
80
|
+
header: cx('ais-ChatPrompt-header', classNames.header),
|
|
81
|
+
body: cx('ais-ChatPrompt-body', classNames.body),
|
|
82
|
+
textarea: cx('ais-ChatPrompt-textarea ais-Scrollbar', disabled && 'ais-ChatPrompt-textarea--disabled', classNames.textarea),
|
|
83
|
+
actions: cx('ais-ChatPrompt-actions', classNames.actions, disabled && 'ais-ChatPrompt-actions--disabled'),
|
|
84
|
+
submit: cx('ais-ChatPrompt-submit', classNames.submit),
|
|
85
|
+
footer: cx('ais-ChatPrompt-footer', classNames.footer)
|
|
86
|
+
};
|
|
87
|
+
var hasValue = typeof value === 'string' ? value.trim() !== '' : Boolean(value);
|
|
88
|
+
var canStop = status === 'submitted' || status === 'streaming';
|
|
89
|
+
var buttonDisabled = !hasValue && !canStop || disabled;
|
|
90
|
+
var submitIcon = canStop ? createElement(StopIconComponent, {
|
|
91
|
+
createElement: createElement
|
|
92
|
+
}) : createElement(ArrowUpIconComponent, {
|
|
93
|
+
createElement: createElement
|
|
94
|
+
});
|
|
95
|
+
return createElement("form", {
|
|
96
|
+
className: cx(cssClasses.root, props.className),
|
|
97
|
+
onSubmit: function onSubmit(event) {
|
|
98
|
+
event.preventDefault();
|
|
99
|
+
if (canStop) {
|
|
100
|
+
onStop === null || onStop === void 0 ? void 0 : onStop();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (!hasValue) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
_onSubmit === null || _onSubmit === void 0 ? void 0 : _onSubmit(event);
|
|
107
|
+
}
|
|
108
|
+
}, HeaderComponent && createElement("div", {
|
|
109
|
+
className: cx(cssClasses.header)
|
|
110
|
+
}, createElement(HeaderComponent, null)), createElement("div", {
|
|
111
|
+
className: cx(cssClasses.body),
|
|
112
|
+
onClick: function onClick(e) {
|
|
113
|
+
var _textAreaElement;
|
|
114
|
+
if (e.target === textAreaElement) return;
|
|
115
|
+
(_textAreaElement = textAreaElement) === null || _textAreaElement === void 0 ? void 0 : _textAreaElement.focus();
|
|
116
|
+
}
|
|
117
|
+
}, createElement("textarea", _extends({}, props, {
|
|
118
|
+
ref: function ref(element) {
|
|
119
|
+
return setTextAreaRef(element, promptRef);
|
|
120
|
+
},
|
|
121
|
+
"data-max-rows": maxRows,
|
|
122
|
+
className: cx(cssClasses.textarea),
|
|
123
|
+
value: value,
|
|
124
|
+
placeholder: placeholder || translations.textareaPlaceholder,
|
|
125
|
+
"aria-label": translations.textareaLabel,
|
|
126
|
+
disabled: disabled,
|
|
127
|
+
autoFocus: autoFocus,
|
|
128
|
+
onInput: function onInput(event) {
|
|
129
|
+
adjustHeight();
|
|
130
|
+
_onInput === null || _onInput === void 0 ? void 0 : _onInput(event);
|
|
131
|
+
},
|
|
132
|
+
onKeyDown: function onKeyDown(event) {
|
|
133
|
+
_onKeyDown === null || _onKeyDown === void 0 ? void 0 : _onKeyDown(event);
|
|
134
|
+
if (event.key === 'Enter' && !event.shiftKey) {
|
|
135
|
+
event.preventDefault();
|
|
136
|
+
if (canStop) {
|
|
137
|
+
onStop === null || onStop === void 0 ? void 0 : onStop();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (!hasValue) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
_onSubmit === null || _onSubmit === void 0 ? void 0 : _onSubmit(event);
|
|
144
|
+
}
|
|
145
|
+
if (event.key === 'Escape') {
|
|
146
|
+
if (event.currentTarget && event.currentTarget.blur) {
|
|
147
|
+
event.currentTarget.blur();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
})), createElement("div", {
|
|
152
|
+
className: cx(cssClasses.actions)
|
|
153
|
+
}, createElement(Button, {
|
|
154
|
+
type: "submit",
|
|
155
|
+
variant: "primary",
|
|
156
|
+
size: "sm",
|
|
157
|
+
iconOnly: true,
|
|
158
|
+
className: cx(cssClasses.submit),
|
|
159
|
+
disabled: buttonDisabled,
|
|
160
|
+
"aria-label": function () {
|
|
161
|
+
if (buttonDisabled) return translations.emptyMessageTooltip;
|
|
162
|
+
if (canStop) return translations.stopResponseTooltip;
|
|
163
|
+
return translations.sendMessageTooltip;
|
|
164
|
+
}(),
|
|
165
|
+
"data-status": status
|
|
166
|
+
}, submitIcon))), createElement("div", {
|
|
167
|
+
className: cx(cssClasses.footer)
|
|
168
|
+
}, FooterComponent ? createElement(FooterComponent, null) : createElement("div", {
|
|
169
|
+
className: "ais-ChatPrompt-disclaimer"
|
|
170
|
+
}, translations.disclaimer)));
|
|
171
|
+
};
|
|
172
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ComponentProps, Renderer } from '../../types';
|
|
2
|
+
export type ChatToggleButtonClassNames = {
|
|
3
|
+
/**
|
|
4
|
+
* Class names to apply to the root element
|
|
5
|
+
*/
|
|
6
|
+
root?: string | string[];
|
|
7
|
+
};
|
|
8
|
+
export type ChatToggleButtonOwnProps = {
|
|
9
|
+
/**
|
|
10
|
+
* Whether the chat is open
|
|
11
|
+
*/
|
|
12
|
+
open: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Callback when the button is clicked
|
|
15
|
+
*/
|
|
16
|
+
onClick: () => void;
|
|
17
|
+
/**
|
|
18
|
+
* Optional toggle icon component
|
|
19
|
+
*/
|
|
20
|
+
toggleIconComponent?: (props: {
|
|
21
|
+
isOpen: boolean;
|
|
22
|
+
}) => JSX.Element;
|
|
23
|
+
/**
|
|
24
|
+
* Optional class names
|
|
25
|
+
*/
|
|
26
|
+
classNames?: Partial<ChatToggleButtonClassNames>;
|
|
27
|
+
};
|
|
28
|
+
export type ChatToggleButtonProps = ComponentProps<'button'> & ChatToggleButtonOwnProps;
|
|
29
|
+
export declare function createChatToggleButtonComponent({ createElement }: Renderer): ({ open, onClick, toggleIconComponent: ToggleIconComponent, classNames, className, ...props }: ChatToggleButtonProps) => JSX.Element;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
3
|
+
var _excluded = ["open", "onClick", "toggleIconComponent", "classNames", "className"];
|
|
4
|
+
import { cx } from "../../lib/cx.js";
|
|
5
|
+
import { createButtonComponent } from "../Button.js";
|
|
6
|
+
import { SparklesIconComponent, ChevronUpIconComponent } from "./icons.js";
|
|
7
|
+
export function createChatToggleButtonComponent(_ref) {
|
|
8
|
+
var createElement = _ref.createElement;
|
|
9
|
+
var Button = createButtonComponent({
|
|
10
|
+
createElement: createElement
|
|
11
|
+
});
|
|
12
|
+
return function ChatToggleButton(_ref2) {
|
|
13
|
+
var open = _ref2.open,
|
|
14
|
+
onClick = _ref2.onClick,
|
|
15
|
+
ToggleIconComponent = _ref2.toggleIconComponent,
|
|
16
|
+
_ref2$classNames = _ref2.classNames,
|
|
17
|
+
classNames = _ref2$classNames === void 0 ? {} : _ref2$classNames,
|
|
18
|
+
className = _ref2.className,
|
|
19
|
+
props = _objectWithoutProperties(_ref2, _excluded);
|
|
20
|
+
var defaultIcon = open ? createElement(ChevronUpIconComponent, {
|
|
21
|
+
createElement: createElement,
|
|
22
|
+
width: 28,
|
|
23
|
+
height: 28
|
|
24
|
+
}) : createElement(SparklesIconComponent, {
|
|
25
|
+
createElement: createElement,
|
|
26
|
+
width: 28,
|
|
27
|
+
height: 28
|
|
28
|
+
});
|
|
29
|
+
return createElement(Button, _extends({
|
|
30
|
+
variant: "primary",
|
|
31
|
+
size: "md",
|
|
32
|
+
iconOnly: true,
|
|
33
|
+
className: cx('ais-ChatToggleButton', open && 'ais-ChatToggleButton--open', classNames.root, className),
|
|
34
|
+
onClick: onClick
|
|
35
|
+
}, props), ToggleIconComponent ? createElement(ToggleIconComponent, {
|
|
36
|
+
isOpen: open
|
|
37
|
+
}) : defaultIcon);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** @jsx createElement */
|
|
2
|
+
import type { Renderer } from '../../types';
|
|
3
|
+
type IconProps = Pick<Renderer, 'createElement'> & {
|
|
4
|
+
width?: number;
|
|
5
|
+
height?: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function SparklesIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
8
|
+
export declare function ArrowUpIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
9
|
+
export declare function ArrowRightIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
10
|
+
export declare function ChevronUpIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
11
|
+
export declare function ChevronDownIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
12
|
+
export declare function CloseIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
13
|
+
export declare function MaximizeIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
14
|
+
export declare function MinimizeIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
15
|
+
export declare function StopIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
16
|
+
export declare function ReloadIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
17
|
+
export declare function CopyIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
18
|
+
export declare function MenuIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
19
|
+
export declare function LoadingSpinnerIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
20
|
+
export declare function ChevronLeftIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
21
|
+
export declare function ChevronRightIconComponent({ createElement, width, height, }: IconProps): JSX.Element;
|
|
22
|
+
export {};
|