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.
Files changed (77) hide show
  1. package/dist/cjs/components/Button.js +29 -0
  2. package/dist/cjs/components/Carousel.js +26 -6
  3. package/dist/cjs/components/autocomplete/Autocomplete.js +23 -0
  4. package/dist/cjs/components/autocomplete/AutocompleteIndex.js +39 -0
  5. package/dist/cjs/components/autocomplete/AutocompletePanel.js +25 -0
  6. package/dist/cjs/components/autocomplete/AutocompleteSuggestion.js +20 -0
  7. package/dist/cjs/components/autocomplete/index.js +49 -0
  8. package/dist/cjs/components/chat/Chat.js +79 -0
  9. package/dist/cjs/components/chat/ChatHeader.js +89 -0
  10. package/dist/cjs/components/chat/ChatMessage.js +138 -0
  11. package/dist/cjs/components/chat/ChatMessageError.js +57 -0
  12. package/dist/cjs/components/chat/ChatMessageLoader.js +47 -0
  13. package/dist/cjs/components/chat/ChatMessages.js +192 -0
  14. package/dist/cjs/components/chat/ChatPrompt.js +179 -0
  15. package/dist/cjs/components/chat/ChatToggleButton.js +46 -0
  16. package/dist/cjs/components/chat/icons.js +375 -0
  17. package/dist/cjs/components/chat/types.js +1 -0
  18. package/dist/cjs/components/index.js +132 -0
  19. package/dist/cjs/lib/index.js +22 -0
  20. package/dist/cjs/lib/stickToBottom.js +481 -0
  21. package/dist/cjs/lib/utils/find.js +15 -0
  22. package/dist/cjs/lib/utils/index.js +27 -0
  23. package/dist/cjs/lib/utils/startsWith.js +9 -0
  24. package/dist/cjs/version.js +1 -1
  25. package/dist/cjs/warn.js +40 -0
  26. package/dist/es/components/Button.d.ts +38 -0
  27. package/dist/es/components/Button.js +22 -0
  28. package/dist/es/components/Carousel.d.ts +11 -0
  29. package/dist/es/components/Carousel.js +26 -6
  30. package/dist/es/components/autocomplete/Autocomplete.d.ts +13 -0
  31. package/dist/es/components/autocomplete/Autocomplete.js +16 -0
  32. package/dist/es/components/autocomplete/AutocompleteIndex.d.ts +31 -0
  33. package/dist/es/components/autocomplete/AutocompleteIndex.js +32 -0
  34. package/dist/es/components/autocomplete/AutocompletePanel.d.ts +17 -0
  35. package/dist/es/components/autocomplete/AutocompletePanel.js +18 -0
  36. package/dist/es/components/autocomplete/AutocompleteSuggestion.d.ts +16 -0
  37. package/dist/es/components/autocomplete/AutocompleteSuggestion.js +14 -0
  38. package/dist/es/components/autocomplete/index.d.ts +4 -0
  39. package/dist/es/components/autocomplete/index.js +4 -0
  40. package/dist/es/components/chat/Chat.d.ts +42 -0
  41. package/dist/es/components/chat/Chat.js +72 -0
  42. package/dist/es/components/chat/ChatHeader.d.ts +99 -0
  43. package/dist/es/components/chat/ChatHeader.js +82 -0
  44. package/dist/es/components/chat/ChatMessage.d.ts +124 -0
  45. package/dist/es/components/chat/ChatMessage.js +131 -0
  46. package/dist/es/components/chat/ChatMessageError.d.ts +27 -0
  47. package/dist/es/components/chat/ChatMessageError.js +50 -0
  48. package/dist/es/components/chat/ChatMessageLoader.d.ts +15 -0
  49. package/dist/es/components/chat/ChatMessageLoader.js +40 -0
  50. package/dist/es/components/chat/ChatMessages.d.ts +139 -0
  51. package/dist/es/components/chat/ChatMessages.js +185 -0
  52. package/dist/es/components/chat/ChatPrompt.d.ts +119 -0
  53. package/dist/es/components/chat/ChatPrompt.js +172 -0
  54. package/dist/es/components/chat/ChatToggleButton.d.ts +29 -0
  55. package/dist/es/components/chat/ChatToggleButton.js +39 -0
  56. package/dist/es/components/chat/icons.d.ts +22 -0
  57. package/dist/es/components/chat/icons.js +355 -0
  58. package/dist/es/components/chat/types.d.ts +29 -0
  59. package/dist/es/components/chat/types.js +1 -0
  60. package/dist/es/components/index.d.ts +12 -0
  61. package/dist/es/components/index.js +12 -0
  62. package/dist/es/lib/index.d.ts +2 -0
  63. package/dist/es/lib/index.js +3 -1
  64. package/dist/es/lib/stickToBottom.d.ts +114 -0
  65. package/dist/es/lib/stickToBottom.js +474 -0
  66. package/dist/es/lib/utils/find.d.ts +1 -0
  67. package/dist/es/lib/utils/find.js +9 -0
  68. package/dist/es/lib/utils/index.d.ts +2 -0
  69. package/dist/es/lib/utils/index.js +2 -0
  70. package/dist/es/lib/utils/startsWith.d.ts +1 -0
  71. package/dist/es/lib/utils/startsWith.js +3 -0
  72. package/dist/es/types/Renderer.d.ts +1 -1
  73. package/dist/es/version.d.ts +1 -1
  74. package/dist/es/version.js +1 -1
  75. package/dist/es/warn.d.ts +10 -0
  76. package/dist/es/warn.js +33 -0
  77. 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 {};