@gravity-ui/aikit 2.20.2 → 2.20.3-beta.0933029eb4fcd6bb7fd953e0d7dbeb5c66646057.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/build/cjs/components/atoms/MarkdownRenderer/MarkdownRenderer.css +1 -0
- package/build/cjs/components/molecules/PromptInputBody/PromptInputBody.css +2 -0
- package/build/cjs/components/molecules/Tabs/Tabs.css +1 -0
- package/build/cjs/components/organisms/FileUploadDialog/FileUploadDialog.css +1 -0
- package/build/cjs/components/organisms/MessageList/MessageList.css +2 -0
- package/build/cjs/components/pages/ChatContainer/ChatContainer.css +27 -0
- package/build/cjs/components/pages/ChatContainer/ChatContainer.js +33 -5
- package/build/cjs/components/pages/ChatContainer/ChatContainer.js.map +1 -1
- package/build/cjs/components/pages/ChatContainer/useKeyboardLayoutFit.d.ts +75 -0
- package/build/cjs/components/pages/ChatContainer/useKeyboardLayoutFit.js +141 -0
- package/build/cjs/components/pages/ChatContainer/useKeyboardLayoutFit.js.map +1 -0
- package/build/cjs/components/templates/EmptyContainer/EmptyContainer.css +5 -1
- package/build/cjs/components/templates/History/History.css +1 -0
- package/build/cjs/hooks/useKeyboardViewportFit.d.ts +51 -2
- package/build/cjs/hooks/useKeyboardViewportFit.js +61 -7
- package/build/cjs/hooks/useKeyboardViewportFit.js.map +1 -1
- package/build/cjs/package.json +1 -1
- package/build/cjs/themes/common.css +8 -0
- package/build/cjs/themes/variables.css +8 -0
- package/build/docs/INDEX.md +1 -1
- package/build/docs/components/atoms/MarkdownRenderer.md +5 -4
- package/build/docs/components/molecules/PromptInputBody.md +5 -3
- package/build/docs/components/molecules/Tabs.md +1 -0
- package/build/docs/components/organisms/MessageList.md +4 -3
- package/build/docs/components/pages/ChatContainer.md +72 -24
- package/build/docs/components/templates/EmptyContainer.md +21 -18
- package/build/docs/components/templates/History.md +11 -10
- package/build/docs/guides/HOOKS.md +61 -1
- package/build/docs/guides/THEMING.md +39 -24
- package/build/esm/components/atoms/MarkdownRenderer/MarkdownRenderer.css +1 -0
- package/build/esm/components/molecules/PromptInputBody/PromptInputBody.css +2 -0
- package/build/esm/components/molecules/Tabs/Tabs.css +1 -0
- package/build/esm/components/organisms/FileUploadDialog/FileUploadDialog.css +1 -0
- package/build/esm/components/organisms/MessageList/MessageList.css +2 -0
- package/build/esm/components/pages/ChatContainer/ChatContainer.css +27 -0
- package/build/esm/components/pages/ChatContainer/ChatContainer.js +33 -5
- package/build/esm/components/pages/ChatContainer/ChatContainer.js.map +1 -1
- package/build/esm/components/pages/ChatContainer/useKeyboardLayoutFit.d.ts +75 -0
- package/build/esm/components/pages/ChatContainer/useKeyboardLayoutFit.js +134 -0
- package/build/esm/components/pages/ChatContainer/useKeyboardLayoutFit.js.map +1 -0
- package/build/esm/components/templates/EmptyContainer/EmptyContainer.css +5 -1
- package/build/esm/components/templates/History/History.css +1 -0
- package/build/esm/hooks/useKeyboardViewportFit.d.ts +51 -2
- package/build/esm/hooks/useKeyboardViewportFit.js +59 -6
- package/build/esm/hooks/useKeyboardViewportFit.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/themes/common.css +8 -0
- package/build/esm/themes/variables.css +8 -0
- package/docs/HOOKS.md +61 -1
- package/docs/THEMING.md +39 -24
- package/llms-full.txt +100 -25
- package/package.json +1 -1
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
}
|
|
10
10
|
.g-aikit-prompt-input-body__textarea-control {
|
|
11
11
|
resize: none;
|
|
12
|
+
overscroll-behavior: var(--g-aikit-scroll-overscroll-behavior, auto);
|
|
13
|
+
max-height: var(--g-aikit-prompt-input-body-textarea-max-height, none);
|
|
12
14
|
}
|
|
13
15
|
.g-aikit-prompt-input-body .g-text-area_disabled {
|
|
14
16
|
--_--background-color: none;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
.g-aikit-message-list {
|
|
2
2
|
overflow-y: auto;
|
|
3
|
+
overscroll-behavior: var(--g-aikit-scroll-overscroll-behavior, auto);
|
|
3
4
|
overflow-anchor: none;
|
|
4
5
|
display: flex;
|
|
5
6
|
flex-direction: column;
|
|
@@ -45,6 +46,7 @@
|
|
|
45
46
|
.g-aikit-message-list__list {
|
|
46
47
|
flex: 1;
|
|
47
48
|
min-height: 0;
|
|
49
|
+
overscroll-behavior: var(--g-aikit-scroll-overscroll-behavior, auto);
|
|
48
50
|
}
|
|
49
51
|
.g-aikit-message-list__row {
|
|
50
52
|
padding-block-end: var(--g-spacing-4);
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
@keyframes g-aikit-prevent-scroll-on-focus {
|
|
2
|
+
0% {
|
|
3
|
+
opacity: 0;
|
|
4
|
+
}
|
|
5
|
+
100% {
|
|
6
|
+
opacity: 1;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
1
9
|
.g-aikit-chat-container {
|
|
2
10
|
display: flex;
|
|
3
11
|
flex-direction: column;
|
|
@@ -7,6 +15,7 @@
|
|
|
7
15
|
background: var(--g-aikit-chat-container-background);
|
|
8
16
|
}
|
|
9
17
|
.g-aikit-chat-container_mobile {
|
|
18
|
+
--g-aikit-scroll-overscroll-behavior: contain;
|
|
10
19
|
--g-aikit-layout-base-padding-m: var(--g-aikit-chat-container-mobile-padding);
|
|
11
20
|
--g-aikit-empty-container-mobile-padding: var(
|
|
12
21
|
--g-aikit-chat-container-mobile-empty-container-padding
|
|
@@ -40,12 +49,14 @@
|
|
|
40
49
|
.g-aikit-chat-container_mobile .g-aikit-prompt-input__suggestions .g-aikit-suggestions__container {
|
|
41
50
|
min-height: 0;
|
|
42
51
|
overflow: hidden auto;
|
|
52
|
+
overscroll-behavior: var(--g-aikit-scroll-overscroll-behavior, auto);
|
|
43
53
|
}
|
|
44
54
|
.g-aikit-chat-container_mobile .g-aikit-prompt-input__suggestions .g-aikit-suggestions__title {
|
|
45
55
|
display: flex;
|
|
46
56
|
flex-direction: column;
|
|
47
57
|
min-height: var(--g-aikit-chat-container-mobile-suggestions-title-min-height);
|
|
48
58
|
overflow: hidden auto;
|
|
59
|
+
overscroll-behavior: var(--g-aikit-scroll-overscroll-behavior, auto);
|
|
49
60
|
}
|
|
50
61
|
.g-aikit-chat-container_mobile .g-aikit-prompt-input__suggestions .g-aikit-suggestions {
|
|
51
62
|
flex-shrink: 0;
|
|
@@ -58,6 +69,21 @@
|
|
|
58
69
|
--g-aikit-empty-container-mobile-padding: var(
|
|
59
70
|
--g-aikit-chat-container-mobile-keyboard-empty-container-padding
|
|
60
71
|
);
|
|
72
|
+
--g-aikit-empty-container-suggestions-display: var(
|
|
73
|
+
--g-aikit-chat-container-mobile-keyboard-suggestions-display
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
.g-aikit-chat-container__viewport-probe {
|
|
77
|
+
position: fixed;
|
|
78
|
+
inset-block-start: 0;
|
|
79
|
+
inset-inline-start: 0;
|
|
80
|
+
width: 0;
|
|
81
|
+
height: 100dvh;
|
|
82
|
+
visibility: hidden;
|
|
83
|
+
pointer-events: none;
|
|
84
|
+
}
|
|
85
|
+
.g-aikit-chat-container_mobile .g-aikit-prompt-input-body__textarea-control:focus {
|
|
86
|
+
animation: g-aikit-prevent-scroll-on-focus var(--g-aikit-chat-container-focus-guard-time);
|
|
61
87
|
}
|
|
62
88
|
.g-aikit-chat-container_mobile .g-aikit-markdown-renderer {
|
|
63
89
|
--yfm-font-size: var(--g-aikit-chat-container-mobile-font-size);
|
|
@@ -82,6 +108,7 @@
|
|
|
82
108
|
}
|
|
83
109
|
.g-aikit-chat-container_mobile .g-aikit-chat-container__header {
|
|
84
110
|
--g-aikit-button-group-gap: var(--g-spacing-2);
|
|
111
|
+
flex-shrink: 0;
|
|
85
112
|
min-height: var(--g-aikit-chat-container-mobile-header-height);
|
|
86
113
|
padding: var(--g-aikit-chat-container-mobile-header-padding);
|
|
87
114
|
}
|
|
@@ -17,6 +17,7 @@ const chatContainerQa_1 = require("./chatContainerQa.js");
|
|
|
17
17
|
const i18n_1 = require("./i18n/index.js");
|
|
18
18
|
const useChatContainer_1 = require("./useChatContainer.js");
|
|
19
19
|
const useChatContainerMascot_1 = require("./useChatContainerMascot.js");
|
|
20
|
+
const useKeyboardLayoutFit_1 = require("./useKeyboardLayoutFit.js");
|
|
20
21
|
require("./ChatContainer.css");
|
|
21
22
|
const b = (0, cn_1.block)('chat-container');
|
|
22
23
|
function toSuggestionContext(id, data) {
|
|
@@ -48,10 +49,10 @@ function buildFinalPromptInputHeaderProps(args) {
|
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
function buildFinalPromptInputProps(args) {
|
|
51
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
|
|
52
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
|
|
52
53
|
const { promptInputProps, onSendMessage, onCancel, status, contextItems, showContextIndicator, contextIndicatorProps, texts: textsArg, promptInputKey, qaMap, onValueChange, } = args;
|
|
53
54
|
const texts = textsArg !== null && textsArg !== void 0 ? textsArg : {};
|
|
54
|
-
const
|
|
55
|
+
const _s = (_a = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.bodyProps) !== null && _a !== void 0 ? _a : {}, { autoFocusOnNewChat: _autoFocusOnNewChat, autoFocusOnChatSelect: _autoFocusOnChatSelect } = _s, restBodyProps = tslib_1.__rest(_s, ["autoFocusOnNewChat", "autoFocusOnChatSelect"]);
|
|
55
56
|
const suggestionsProps = mergePromptInputSuggestionsProps(promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.suggestionsProps, texts.promptSuggestTitle);
|
|
56
57
|
return Object.assign(Object.assign({}, promptInputProps), { onValueChange: onValueChange || (promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.onValueChange)
|
|
57
58
|
? (value) => {
|
|
@@ -67,7 +68,12 @@ function buildFinalPromptInputProps(args) {
|
|
|
67
68
|
showContextIndicator,
|
|
68
69
|
contextIndicatorProps,
|
|
69
70
|
qa: (_c = (0, chatContainerQa_1.resolveChatContainerQa)(qaMap, 'promptInputHeader', 'prompt-input-header')) !== null && _c !== void 0 ? _c : (_d = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.headerProps) === null || _d === void 0 ? void 0 : _d.qa,
|
|
70
|
-
}), bodyProps: Object.assign(Object.assign({}, restBodyProps), { placeholder: texts.promptPlaceholder || (restBodyProps === null || restBodyProps === void 0 ? void 0 : restBodyProps.placeholder) || (0, i18n_1.i18n)('prompt-placeholder'),
|
|
71
|
+
}), bodyProps: Object.assign(Object.assign({}, restBodyProps), { placeholder: texts.promptPlaceholder || (restBodyProps === null || restBodyProps === void 0 ? void 0 : restBodyProps.placeholder) || (0, i18n_1.i18n)('prompt-placeholder'),
|
|
72
|
+
// The remount that clears the draft on a new or a freshly picked chat also puts the
|
|
73
|
+
// cursor in the field. On a touch device that raises the keyboard over half the
|
|
74
|
+
// screen, so a consumer that asked for no auto focus is taken at its word and keeps
|
|
75
|
+
// the clearing without the cursor.
|
|
76
|
+
autoFocus: (_e = restBodyProps === null || restBodyProps === void 0 ? void 0 : restBodyProps.autoFocus) !== null && _e !== void 0 ? _e : promptInputKey > 0, qa: (_f = (0, chatContainerQa_1.resolveChatContainerQa)(qaMap, 'promptInputBody', 'prompt-input-body')) !== null && _f !== void 0 ? _f : restBodyProps === null || restBodyProps === void 0 ? void 0 : restBodyProps.qa }), footerProps: Object.assign(Object.assign({}, promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps), { submitButtonTooltipSend: (_g = texts === null || texts === void 0 ? void 0 : texts.submitSendTooltip) !== null && _g !== void 0 ? _g : (_h = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps) === null || _h === void 0 ? void 0 : _h.submitButtonTooltipSend, submitButtonTooltipCancel: (_j = texts === null || texts === void 0 ? void 0 : texts.submitCancelTooltip) !== null && _j !== void 0 ? _j : (_k = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps) === null || _k === void 0 ? void 0 : _k.submitButtonTooltipCancel, submitButtonCancelableText: (_l = texts === null || texts === void 0 ? void 0 : texts.submitButtonCancelableText) !== null && _l !== void 0 ? _l : (_m = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps) === null || _m === void 0 ? void 0 : _m.submitButtonCancelableText, qa: (_o = (0, chatContainerQa_1.resolveChatContainerQa)(qaMap, 'promptInputFooter', 'prompt-input-footer')) !== null && _o !== void 0 ? _o : (_p = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps) === null || _p === void 0 ? void 0 : _p.qa, submitButtonQa: (_q = (0, chatContainerQa_1.resolveChatContainerQa)(qaMap, 'submitButton', 'submit-button')) !== null && _q !== void 0 ? _q : (_r = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps) === null || _r === void 0 ? void 0 : _r.submitButtonQa }) });
|
|
71
77
|
}
|
|
72
78
|
/**
|
|
73
79
|
* ChatContainer - fully assembled chat component, the main exportable component of the library.
|
|
@@ -82,9 +88,19 @@ function ChatContainer(props) {
|
|
|
82
88
|
const isMobileContext = (0, uikit_1.useMobile)();
|
|
83
89
|
const isMobile = isMobileProp !== null && isMobileProp !== void 0 ? isMobileProp : isMobileContext;
|
|
84
90
|
const rootRef = (0, react_1.useRef)(null);
|
|
91
|
+
const headerRef = (0, react_1.useRef)(null);
|
|
92
|
+
const footerRef = (0, react_1.useRef)(null);
|
|
93
|
+
const viewportProbeRef = (0, react_1.useRef)(null);
|
|
94
|
+
const isKeyboardTracked = isMobile && adjustToKeyboard;
|
|
85
95
|
// Keeps the footer (prompt input + disclaimer) above the on-screen keyboard on iOS Safari,
|
|
86
96
|
// where the layout viewport stays full-height while the keyboard is open.
|
|
87
|
-
const { isKeyboardOpen, maxHeight } = (0, hooks_1.useKeyboardViewportFit)(rootRef,
|
|
97
|
+
const { isKeyboardOpen, maxHeight } = (0, hooks_1.useKeyboardViewportFit)(rootRef, isKeyboardTracked, {
|
|
98
|
+
viewportProbeRef,
|
|
99
|
+
});
|
|
100
|
+
// Меряем всегда, а не только при открытой клавиатуре: иначе на закрытой поле успевает
|
|
101
|
+
// вырасти по своему счётчику строк, и на следующем открытии оно уже выше, чем доступное
|
|
102
|
+
// место, а потолок к этому моменту снят
|
|
103
|
+
const { promptInputMaxHeight, isHeroFitting } = (0, useKeyboardLayoutFit_1.useKeyboardLayoutFit)(rootRef, headerRef, footerRef, isKeyboardTracked);
|
|
88
104
|
const hookState = (0, useChatContainer_1.useChatContainer)(props);
|
|
89
105
|
const mascotState = (0, useChatContainerMascot_1.useChatContainerMascot)({
|
|
90
106
|
config: mascotConfig,
|
|
@@ -330,10 +346,22 @@ function ChatContainer(props) {
|
|
|
330
346
|
texts.historySearchPlaceholder,
|
|
331
347
|
]);
|
|
332
348
|
const showFooter = finalPromptInputProps || finalDisclaimerProps;
|
|
349
|
+
const rootStyle = (0, react_1.useMemo)(() => {
|
|
350
|
+
if (maxHeight === undefined && promptInputMaxHeight === undefined && isHeroFitting) {
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
return Object.assign(Object.assign(Object.assign({}, (maxHeight === undefined ? undefined : { maxHeight })), (promptInputMaxHeight === undefined
|
|
354
|
+
? undefined
|
|
355
|
+
: {
|
|
356
|
+
'--g-aikit-prompt-input-body-textarea-max-height': `${promptInputMaxHeight}px`,
|
|
357
|
+
})), (isHeroFitting
|
|
358
|
+
? undefined
|
|
359
|
+
: { '--g-aikit-empty-container-hero-visibility': 'hidden' }));
|
|
360
|
+
}, [maxHeight, promptInputMaxHeight, isHeroFitting]);
|
|
333
361
|
return ((0, jsx_runtime_1.jsx)(uikit_1.MobileProvider, { mobile: isMobile, children: (0, jsx_runtime_1.jsxs)("div", { ref: rootRef, className: b({
|
|
334
362
|
mobile: isMobile,
|
|
335
363
|
'keyboard-open': isKeyboardOpen,
|
|
336
364
|
'floating-header': floatingHeader,
|
|
337
|
-
}, className), style:
|
|
365
|
+
}, className), style: rootStyle, "data-qa": (0, chatContainerQa_1.resolveChatContainerRootQa)(qaMap), children: [isKeyboardTracked && ((0, jsx_runtime_1.jsx)("div", { className: b('viewport-probe'), ref: viewportProbeRef, "aria-hidden": true })), (0, jsx_runtime_1.jsx)("div", { className: b('header', headerClassName), ref: headerRef, children: (0, jsx_runtime_1.jsx)(Header_1.Header, Object.assign({}, finalHeaderProps)) }), (0, jsx_runtime_1.jsx)("div", { className: b('content', { view: hookState.chatContentView }, contentClassName), children: (0, jsx_runtime_1.jsx)(ChatContent_1.ChatContent, Object.assign({}, finalContentProps)) }), showFooter && ((0, jsx_runtime_1.jsxs)("div", { className: b('footer', { view: hookState.chatContentView }, footerClassName), ref: footerRef, children: [finalPromptInputProps && ((0, jsx_runtime_1.jsx)(PromptInput_1.PromptInput, Object.assign({}, finalPromptInputProps), hookState.promptInputKey)), finalDisclaimerProps && (0, jsx_runtime_1.jsx)(Disclaimer_1.Disclaimer, Object.assign({}, finalDisclaimerProps))] })), (0, jsx_runtime_1.jsx)(History_1.History, Object.assign({}, finalHistoryProps))] }) }));
|
|
338
366
|
}
|
|
339
367
|
//# sourceMappingURL=ChatContainer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatContainer.js","sourceRoot":"../../../../../src","sources":["components/pages/ChatContainer/ChatContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type ReactNode, useCallback, useMemo, useRef} from 'react';\n\nimport {MobileProvider, useMobile} from '@gravity-ui/uikit';\n\nimport {getMascotAnimationType, useKeyboardViewportFit} from '../../../hooks';\nimport type {TSuggestionContext} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {getMascotNode, resolveMascotAssets, resolveMascotCollection} from '../../../utils/mascot';\nimport {Disclaimer} from '../../atoms/Disclaimer';\nimport {Header, HeaderAction, type HeaderProps} from '../../organisms/Header';\nimport {PromptInput, type PromptInputProps} from '../../organisms/PromptInput';\nimport {ChatContent} from '../../templates/ChatContent';\nimport {History} from '../../templates/History';\n\nimport {\n normalizeChatContainerQa,\n resolveChatContainerQa,\n resolveChatContainerRootQa,\n resolveHeaderMenuItemQa,\n} from './chatContainerQa';\nimport {i18n} from './i18n';\nimport type {ChatContainerProps, ChatContainerTexts} from './types';\nimport {useChatContainer} from './useChatContainer';\nimport {useChatContainerMascot} from './useChatContainerMascot';\n\nimport './ChatContainer.scss';\n\nconst b = block('chat-container');\n\ntype NormalizedChatContainerQa = ReturnType<typeof normalizeChatContainerQa>;\n\nfunction toSuggestionContext(\n id?: string,\n data?: Record<string, unknown>,\n): TSuggestionContext | undefined {\n if (!id && !data) {\n return undefined;\n }\n\n return {\n ...(id && {id}),\n ...(data && {data}),\n };\n}\n\nfunction mergePromptInputSuggestionsProps(\n fromProps: PromptInputProps['suggestionsProps'] | undefined,\n textsSuggestTitle: ReactNode | undefined,\n): PromptInputProps['suggestionsProps'] | undefined {\n const hasSuggestionsFromProps = Boolean(fromProps);\n const hasSuggestTitleFromTexts = textsSuggestTitle !== undefined;\n if (!hasSuggestionsFromProps && !hasSuggestTitleFromTexts) {\n return undefined;\n }\n return {\n ...fromProps,\n suggestTitle: textsSuggestTitle ?? fromProps?.suggestTitle,\n };\n}\n\nfunction buildFinalPromptInputHeaderProps(args: {\n headerProps: NonNullable<ChatContainerProps['promptInputProps']>['headerProps'];\n contextItems: ChatContainerProps['contextItems'];\n showContextIndicator: ChatContainerProps['showContextIndicator'];\n contextIndicatorProps: ChatContainerProps['contextIndicatorProps'];\n qa: string | undefined;\n}): NonNullable<ChatContainerProps['promptInputProps']>['headerProps'] {\n const {headerProps, contextItems, showContextIndicator, contextIndicatorProps, qa} = args;\n\n // topContent replaces the default header entirely, so context-related\n // props are not allowed (and would be ignored) alongside it\n if (headerProps?.topContent) {\n return {topContent: headerProps.topContent, qa};\n }\n\n return {\n contextItems,\n showContextIndicator: showContextIndicator ?? headerProps?.showContextIndicator,\n contextIndicatorProps: contextIndicatorProps ?? headerProps?.contextIndicatorProps,\n qa,\n };\n}\n\nfunction buildFinalPromptInputProps(args: {\n promptInputProps: ChatContainerProps['promptInputProps'];\n onSendMessage: ChatContainerProps['onSendMessage'];\n onCancel: ChatContainerProps['onCancel'];\n status: ChatContainerProps['status'];\n contextItems: ChatContainerProps['contextItems'];\n showContextIndicator: ChatContainerProps['showContextIndicator'];\n contextIndicatorProps: ChatContainerProps['contextIndicatorProps'];\n texts: ChatContainerTexts;\n promptInputKey: number;\n qaMap: NormalizedChatContainerQa;\n onValueChange?: (value: string) => void;\n}) {\n const {\n promptInputProps,\n onSendMessage,\n onCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts: textsArg,\n promptInputKey,\n qaMap,\n onValueChange,\n } = args;\n\n const texts = textsArg ?? {};\n\n const {\n autoFocusOnNewChat: _autoFocusOnNewChat,\n autoFocusOnChatSelect: _autoFocusOnChatSelect,\n ...restBodyProps\n } = promptInputProps?.bodyProps ?? {};\n\n const suggestionsProps = mergePromptInputSuggestionsProps(\n promptInputProps?.suggestionsProps,\n texts.promptSuggestTitle,\n );\n\n return {\n ...promptInputProps,\n onValueChange:\n onValueChange || promptInputProps?.onValueChange\n ? (value: string) => {\n onValueChange?.(value);\n promptInputProps?.onValueChange?.(value);\n }\n : undefined,\n qa: resolveChatContainerQa(qaMap, 'promptInput', 'prompt-input') ?? promptInputProps?.qa,\n onSend: onSendMessage,\n onCancel,\n status,\n suggestionsProps,\n headerProps: buildFinalPromptInputHeaderProps({\n headerProps: promptInputProps?.headerProps,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputHeader', 'prompt-input-header') ??\n promptInputProps?.headerProps?.qa,\n }),\n bodyProps: {\n ...restBodyProps,\n placeholder:\n texts.promptPlaceholder || restBodyProps?.placeholder || i18n('prompt-placeholder'),\n autoFocus: promptInputKey > 0 || restBodyProps?.autoFocus,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputBody', 'prompt-input-body') ??\n restBodyProps?.qa,\n },\n footerProps: {\n ...promptInputProps?.footerProps,\n submitButtonTooltipSend:\n texts?.submitSendTooltip ?? promptInputProps?.footerProps?.submitButtonTooltipSend,\n submitButtonTooltipCancel:\n texts?.submitCancelTooltip ??\n promptInputProps?.footerProps?.submitButtonTooltipCancel,\n submitButtonCancelableText:\n texts?.submitButtonCancelableText ??\n promptInputProps?.footerProps?.submitButtonCancelableText,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputFooter', 'prompt-input-footer') ??\n promptInputProps?.footerProps?.qa,\n submitButtonQa:\n resolveChatContainerQa(qaMap, 'submitButton', 'submit-button') ??\n promptInputProps?.footerProps?.submitButtonQa,\n },\n };\n}\n\n/**\n * ChatContainer - fully assembled chat component, the main exportable component of the library.\n * Integrates Header, ChatContent, History and manages their state.\n *\n * @param props - component props\n * @returns React component\n */\nexport function ChatContainer(props: ChatContainerProps) {\n const {\n chats = [],\n messages = [],\n onSendMessage,\n onDeleteChat,\n onCancel,\n onRetry,\n status = 'ready',\n error = null,\n showActionsOnHover = false,\n contextItems = [],\n showContextIndicator,\n contextIndicatorProps,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxProps,\n messageListConfig,\n mascotConfig,\n headerProps = {},\n contentProps = {},\n emptyContainerProps = {},\n promptInputProps = {},\n disclaimerProps = {},\n historyProps = {},\n welcomeConfig,\n texts = {},\n hideTitleOnEmptyChat = false,\n isMobile: isMobileProp,\n adjustToKeyboard = true,\n floatingHeader = false,\n className,\n headerClassName,\n contentClassName,\n footerClassName,\n qa,\n } = props;\n\n const isMobileContext = useMobile();\n const isMobile = isMobileProp ?? isMobileContext;\n\n const rootRef = useRef<HTMLDivElement>(null);\n // Keeps the footer (prompt input + disclaimer) above the on-screen keyboard on iOS Safari,\n // where the layout viewport stays full-height while the keyboard is open.\n const {isKeyboardOpen, maxHeight} = useKeyboardViewportFit(\n rootRef,\n isMobile && adjustToKeyboard,\n );\n\n const hookState = useChatContainer(props);\n\n const mascotState = useChatContainerMascot({\n config: mascotConfig,\n view: hookState.chatContentView === 'empty' ? 'hero' : 'chat',\n status,\n messagesCount: messages.length,\n activeChatId: hookState.activeChat?.id,\n promptInputKey: hookState.promptInputKey,\n });\n\n const wrappedOnSendMessage = useCallback(\n async (...args: Parameters<typeof onSendMessage>) => {\n mascotState.notifyActivity();\n return onSendMessage(...args);\n },\n [mascotState.notifyActivity, onSendMessage],\n );\n const wrappedOnCancel = useMemo(() => {\n if (!onCancel) {\n return undefined;\n }\n return async () => {\n await onCancel();\n mascotState.handleCancelResolved();\n };\n }, [mascotState.handleCancelResolved, onCancel]);\n const wrappedOnRetry = useMemo(() => {\n if (!onRetry) {\n return undefined;\n }\n return () => {\n mascotState.notifyActivity();\n onRetry();\n };\n }, [mascotState.notifyActivity, onRetry]);\n\n const resolvedMascotAssets = useMemo(\n () => resolveMascotAssets(mascotConfig?.defaultAssets, mascotConfig?.assets),\n [mascotConfig?.assets, mascotConfig?.defaultAssets],\n );\n const resolvedMascots = useMemo(\n () => resolveMascotCollection(mascotConfig?.defaultMascots, mascotConfig?.mascots),\n [mascotConfig?.defaultMascots, mascotConfig?.mascots],\n );\n const mascotView = hookState.chatContentView === 'empty' ? 'hero' : 'chat';\n const mascotNode = useMemo(() => {\n if (!mascotConfig) {\n return undefined;\n }\n if (mascotView === 'hero' && mascotConfig.showOnWelcome === false) {\n return undefined;\n }\n if (mascotView === 'chat' && mascotConfig.showInChat === false) {\n return undefined;\n }\n const node = mascotConfig.renderMascot\n ? mascotConfig.renderMascot({\n view: mascotView,\n state: mascotState.state,\n animationType: getMascotAnimationType(mascotState.state),\n assets: resolvedMascotAssets,\n })\n : getMascotNode(resolvedMascots, mascotView, mascotState.state);\n if (node === undefined || node === null) {\n return undefined;\n }\n return <div className={b('mascot', {view: mascotView})}>{node}</div>;\n }, [mascotConfig, mascotState.state, mascotView, resolvedMascotAssets, resolvedMascots]);\n\n const qaMap = useMemo(() => normalizeChatContainerQa(qa), [qa]);\n\n // Collect i18n texts with overrides\n const headerTitle = useMemo(\n () =>\n texts.headerTitle ||\n headerProps.title ||\n hookState.activeChat?.name ||\n i18n('header-default-title'),\n [texts.headerTitle, headerProps.title, hookState.activeChat?.name],\n );\n\n // Determine if chat is empty\n const isChatEmpty = hookState.chatContentView === 'empty';\n\n // Calculate showTitle based on hideTitleOnEmptyChat option\n const showTitle = useMemo(() => {\n // If explicit showTitle is provided in headerProps, use it\n if (headerProps.showTitle !== undefined) {\n return headerProps.showTitle;\n }\n // If hideTitleOnEmptyChat is enabled, show title only when chat has messages\n if (hideTitleOnEmptyChat && isChatEmpty) {\n return false;\n }\n return true;\n }, [hideTitleOnEmptyChat, isChatEmpty, headerProps.showTitle]);\n\n // Build props for Header\n const finalHeaderProps = useMemo(() => {\n const actionQa: Partial<Record<HeaderAction, string>> = {\n ...headerProps.actionQa,\n };\n const setHeaderActionQa = (\n action: HeaderAction,\n key: 'headerNewChat' | 'headerHistory' | 'headerFolding' | 'headerClose',\n suffix: string,\n ) => {\n const resolved = resolveChatContainerQa(qaMap, key, suffix);\n if (resolved !== undefined) {\n actionQa[action] = resolved;\n }\n };\n setHeaderActionQa(HeaderAction.NewChat, 'headerNewChat', 'header-action-newChat');\n setHeaderActionQa(HeaderAction.History, 'headerHistory', 'header-action-history');\n setHeaderActionQa(HeaderAction.Folding, 'headerFolding', 'header-action-folding');\n setHeaderActionQa(HeaderAction.Close, 'headerClose', 'header-action-close');\n\n const actionTooltipTexts: NonNullable<HeaderProps['actionTooltipTexts']> = {\n [HeaderAction.NewChat]:\n texts.headerNewChatTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.NewChat],\n [HeaderAction.History]:\n texts.headerHistoryTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.History],\n [HeaderAction.Close]:\n texts.headerCloseTooltip ?? headerProps.actionTooltipTexts?.[HeaderAction.Close],\n [HeaderAction.Folding]: {\n collapsed:\n texts.headerFoldingCollapsedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.collapsed,\n opened:\n texts.headerFoldingOpenedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.opened,\n },\n };\n\n return {\n ...headerProps,\n title: headerTitle,\n showTitle,\n baseActions: hookState.baseActions,\n handleNewChat: hookState.handleNewChat,\n handleHistoryToggle: hookState.handleHistoryToggle,\n handleFolding: hookState.handleFolding,\n handleClose: hookState.handleClose,\n historyButtonRef: hookState.historyButtonRef,\n qa: resolveChatContainerQa(qaMap, 'header', 'header') ?? headerProps.qa,\n actionQa,\n actionTooltipTexts,\n menuButtonQa:\n resolveChatContainerQa(qaMap, 'headerMenuButton', 'header-menu-button') ??\n headerProps.menuButtonQa,\n menuButtonTooltip: texts.headerMenuTooltip ?? headerProps.menuButtonTooltip,\n menuItemQa: resolveHeaderMenuItemQa(\n qaMap,\n headerProps.menuItems,\n headerProps.menuItemQa,\n ),\n };\n }, [\n headerTitle,\n showTitle,\n hookState.baseActions,\n hookState.handleNewChat,\n hookState.handleHistoryToggle,\n hookState.handleFolding,\n hookState.handleClose,\n hookState.historyButtonRef,\n headerProps,\n qaMap,\n texts.headerNewChatTooltip,\n texts.headerHistoryTooltip,\n texts.headerCloseTooltip,\n texts.headerFoldingCollapsedTooltip,\n texts.headerFoldingOpenedTooltip,\n texts.headerMenuTooltip,\n ]);\n\n // Build props for EmptyContainer\n const finalEmptyContainerProps = useMemo(() => {\n const {showDefaultTitle = true, showDefaultDescription = true} = welcomeConfig || {};\n\n return {\n ...emptyContainerProps,\n qa:\n resolveChatContainerQa(qaMap, 'emptyState', 'empty-state') ??\n emptyContainerProps.qa,\n image: welcomeConfig?.image,\n title:\n texts.emptyStateTitle ??\n welcomeConfig?.title ??\n emptyContainerProps.title ??\n (showDefaultTitle ? i18n('empty-state-title') : undefined),\n description:\n texts.emptyStateDescription ??\n welcomeConfig?.description ??\n emptyContainerProps.description ??\n (showDefaultDescription ? i18n('empty-state-description') : undefined),\n suggestionTitle:\n texts.emptyStateSuggestionsTitle ??\n welcomeConfig?.suggestionTitle ??\n emptyContainerProps.suggestionTitle,\n suggestions: welcomeConfig?.suggestions,\n alignment: {\n ...emptyContainerProps.alignment,\n ...welcomeConfig?.alignment,\n ...(mascotView === 'hero' &&\n mascotNode &&\n emptyContainerProps.alignment?.hero === undefined &&\n welcomeConfig?.alignment?.hero === undefined\n ? {hero: 'center' as const}\n : {}),\n },\n heroContent:\n emptyContainerProps.heroContent ?? (mascotView === 'hero' ? mascotNode : undefined),\n layout: welcomeConfig?.layout ?? emptyContainerProps.layout,\n wrapText: welcomeConfig?.wrapText ?? emptyContainerProps.wrapText,\n showMore: welcomeConfig?.showMore,\n showMoreText:\n texts.emptyStateShowMoreText ??\n welcomeConfig?.showMoreText ??\n emptyContainerProps.showMoreText ??\n i18n('empty-state-show-more'),\n onSuggestionClick: async (\n content: string,\n suggestionId?: string,\n suggestionData?: Record<string, unknown>,\n ) => {\n const suggestion = toSuggestionContext(suggestionId, suggestionData);\n\n await wrappedOnSendMessage({\n content,\n ...(suggestion && {suggestion}),\n });\n },\n };\n }, [\n welcomeConfig,\n emptyContainerProps,\n wrappedOnSendMessage,\n qaMap,\n texts.emptyStateTitle,\n texts.emptyStateDescription,\n texts.emptyStateSuggestionsTitle,\n texts.emptyStateShowMoreText,\n mascotNode,\n mascotView,\n ]);\n\n // Build props for MessageList\n const messageListProps = useMemo(\n () => ({\n ...messageListConfig,\n messages,\n status,\n errorMessage: texts.errorText\n ? {...(messageListConfig?.errorMessage ?? {}), text: texts.errorText}\n : messageListConfig?.errorMessage || (error ? {text: error.message} : undefined),\n onRetry: wrappedOnRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxProps,\n qa:\n resolveChatContainerQa(qaMap, 'messageList', 'message-list') ??\n messageListConfig?.qa,\n actionPopupProps: {\n ...messageListConfig?.actionPopupProps,\n qa:\n resolveChatContainerQa(qaMap, 'actionPopup', 'action-popup') ??\n messageListConfig?.actionPopupProps?.qa,\n },\n footerContent:\n mascotView === 'chat' && mascotNode !== undefined && mascotNode !== null ? (\n <Fragment>\n {messageListConfig?.footerContent}\n {mascotNode}\n </Fragment>\n ) : (\n messageListConfig?.footerContent\n ),\n }),\n [\n messages,\n status,\n error,\n wrappedOnRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxProps,\n messageListConfig,\n qaMap,\n texts.errorText,\n mascotNode,\n mascotView,\n ],\n );\n\n // Build props for PromptInput\n const finalPromptInputProps = useMemo(\n () =>\n buildFinalPromptInputProps({\n promptInputProps,\n onSendMessage: wrappedOnSendMessage,\n onCancel: wrappedOnCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts,\n promptInputKey: hookState.promptInputKey,\n qaMap,\n onValueChange: mascotConfig ? mascotState.handleValueChange : undefined,\n }),\n [\n wrappedOnSendMessage,\n wrappedOnCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n promptInputProps,\n hookState.promptInputKey,\n qaMap,\n texts.promptPlaceholder,\n texts.promptSuggestTitle,\n texts.submitSendTooltip,\n texts.submitCancelTooltip,\n texts.submitButtonCancelableText,\n mascotState.handleValueChange,\n mascotConfig,\n ],\n );\n\n // Build props for Disclaimer\n const finalDisclaimerProps = useMemo(() => {\n const disclaimerText =\n texts.disclaimerText ?? disclaimerProps.text ?? i18n('disclaimer-text');\n\n return {\n ...disclaimerProps,\n text: disclaimerText,\n qa: resolveChatContainerQa(qaMap, 'disclaimer', 'disclaimer') ?? disclaimerProps.qa,\n };\n }, [disclaimerProps, qaMap, texts.disclaimerText]);\n\n // Build props for ChatContent\n const finalContentProps = useMemo(\n () => ({\n ...contentProps,\n qa: resolveChatContainerQa(qaMap, 'content', 'content') ?? contentProps.qa,\n view: hookState.chatContentView as 'empty' | 'chat',\n emptyContainerProps: finalEmptyContainerProps,\n messageListProps,\n }),\n [\n hookState.chatContentView,\n finalEmptyContainerProps,\n messageListProps,\n contentProps,\n qaMap,\n ],\n );\n\n // Build props for History\n const finalHistoryProps = useMemo(\n () => ({\n ...historyProps,\n qa: resolveChatContainerQa(qaMap, 'history', 'history') ?? historyProps.qa,\n chats,\n selectedChat: hookState.activeChat,\n onSelectChat: hookState.handleSelectChat,\n onDeleteChat,\n open: hookState.isHistoryOpen,\n onOpenChange: (open: boolean) => {\n historyProps.onOpenChange?.(open);\n hookState.handleHistoryOpenChange(open);\n },\n anchorElement: hookState.historyButtonRef.current,\n emptyPlaceholder:\n texts.historyEmptyPlaceholder ??\n historyProps.emptyPlaceholder ??\n i18n('history-empty'),\n emptyFilteredPlaceholder:\n texts.historyEmptyFilteredPlaceholder ??\n historyProps.emptyFilteredPlaceholder ??\n i18n('history-empty-filtered'),\n searchPlaceholder: texts.historySearchPlaceholder ?? historyProps.searchPlaceholder,\n }),\n [\n chats,\n hookState.activeChat,\n hookState.handleSelectChat,\n onDeleteChat,\n hookState.isHistoryOpen,\n hookState.handleHistoryOpenChange,\n hookState.historyButtonRef,\n historyProps,\n qaMap,\n texts.historyEmptyPlaceholder,\n texts.historyEmptyFilteredPlaceholder,\n texts.historySearchPlaceholder,\n ],\n );\n\n const showFooter = finalPromptInputProps || finalDisclaimerProps;\n\n return (\n <MobileProvider mobile={isMobile}>\n <div\n ref={rootRef}\n className={b(\n {\n mobile: isMobile,\n 'keyboard-open': isKeyboardOpen,\n 'floating-header': floatingHeader,\n },\n className,\n )}\n style={maxHeight === undefined ? undefined : {maxHeight}}\n data-qa={resolveChatContainerRootQa(qaMap)}\n >\n <div className={b('header', headerClassName)}>\n <Header {...finalHeaderProps} />\n </div>\n <div className={b('content', {view: hookState.chatContentView}, contentClassName)}>\n <ChatContent {...finalContentProps} />\n </div>\n {showFooter && (\n <div\n className={b('footer', {view: hookState.chatContentView}, footerClassName)}\n >\n {finalPromptInputProps && (\n <PromptInput\n key={hookState.promptInputKey}\n {...finalPromptInputProps}\n />\n )}\n {finalDisclaimerProps && <Disclaimer {...finalDisclaimerProps} />}\n </div>\n )}\n {/* History is integrated via popup anchored to button in Header */}\n <History {...finalHistoryProps} />\n </div>\n </MobileProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ChatContainer.js","sourceRoot":"../../../../../src","sources":["components/pages/ChatContainer/ChatContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type CSSProperties, Fragment, type ReactNode, useCallback, useMemo, useRef} from 'react';\n\nimport {MobileProvider, useMobile} from '@gravity-ui/uikit';\n\nimport {getMascotAnimationType, useKeyboardViewportFit} from '../../../hooks';\nimport type {TSuggestionContext} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {getMascotNode, resolveMascotAssets, resolveMascotCollection} from '../../../utils/mascot';\nimport {Disclaimer} from '../../atoms/Disclaimer';\nimport {Header, HeaderAction, type HeaderProps} from '../../organisms/Header';\nimport {PromptInput, type PromptInputProps} from '../../organisms/PromptInput';\nimport {ChatContent} from '../../templates/ChatContent';\nimport {History} from '../../templates/History';\n\nimport {\n normalizeChatContainerQa,\n resolveChatContainerQa,\n resolveChatContainerRootQa,\n resolveHeaderMenuItemQa,\n} from './chatContainerQa';\nimport {i18n} from './i18n';\nimport type {ChatContainerProps, ChatContainerTexts} from './types';\nimport {useChatContainer} from './useChatContainer';\nimport {useChatContainerMascot} from './useChatContainerMascot';\nimport {useKeyboardLayoutFit} from './useKeyboardLayoutFit';\n\nimport './ChatContainer.scss';\n\nconst b = block('chat-container');\n\ntype NormalizedChatContainerQa = ReturnType<typeof normalizeChatContainerQa>;\n\nfunction toSuggestionContext(\n id?: string,\n data?: Record<string, unknown>,\n): TSuggestionContext | undefined {\n if (!id && !data) {\n return undefined;\n }\n\n return {\n ...(id && {id}),\n ...(data && {data}),\n };\n}\n\nfunction mergePromptInputSuggestionsProps(\n fromProps: PromptInputProps['suggestionsProps'] | undefined,\n textsSuggestTitle: ReactNode | undefined,\n): PromptInputProps['suggestionsProps'] | undefined {\n const hasSuggestionsFromProps = Boolean(fromProps);\n const hasSuggestTitleFromTexts = textsSuggestTitle !== undefined;\n if (!hasSuggestionsFromProps && !hasSuggestTitleFromTexts) {\n return undefined;\n }\n return {\n ...fromProps,\n suggestTitle: textsSuggestTitle ?? fromProps?.suggestTitle,\n };\n}\n\nfunction buildFinalPromptInputHeaderProps(args: {\n headerProps: NonNullable<ChatContainerProps['promptInputProps']>['headerProps'];\n contextItems: ChatContainerProps['contextItems'];\n showContextIndicator: ChatContainerProps['showContextIndicator'];\n contextIndicatorProps: ChatContainerProps['contextIndicatorProps'];\n qa: string | undefined;\n}): NonNullable<ChatContainerProps['promptInputProps']>['headerProps'] {\n const {headerProps, contextItems, showContextIndicator, contextIndicatorProps, qa} = args;\n\n // topContent replaces the default header entirely, so context-related\n // props are not allowed (and would be ignored) alongside it\n if (headerProps?.topContent) {\n return {topContent: headerProps.topContent, qa};\n }\n\n return {\n contextItems,\n showContextIndicator: showContextIndicator ?? headerProps?.showContextIndicator,\n contextIndicatorProps: contextIndicatorProps ?? headerProps?.contextIndicatorProps,\n qa,\n };\n}\n\nfunction buildFinalPromptInputProps(args: {\n promptInputProps: ChatContainerProps['promptInputProps'];\n onSendMessage: ChatContainerProps['onSendMessage'];\n onCancel: ChatContainerProps['onCancel'];\n status: ChatContainerProps['status'];\n contextItems: ChatContainerProps['contextItems'];\n showContextIndicator: ChatContainerProps['showContextIndicator'];\n contextIndicatorProps: ChatContainerProps['contextIndicatorProps'];\n texts: ChatContainerTexts;\n promptInputKey: number;\n qaMap: NormalizedChatContainerQa;\n onValueChange?: (value: string) => void;\n}) {\n const {\n promptInputProps,\n onSendMessage,\n onCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts: textsArg,\n promptInputKey,\n qaMap,\n onValueChange,\n } = args;\n\n const texts = textsArg ?? {};\n\n const {\n autoFocusOnNewChat: _autoFocusOnNewChat,\n autoFocusOnChatSelect: _autoFocusOnChatSelect,\n ...restBodyProps\n } = promptInputProps?.bodyProps ?? {};\n\n const suggestionsProps = mergePromptInputSuggestionsProps(\n promptInputProps?.suggestionsProps,\n texts.promptSuggestTitle,\n );\n\n return {\n ...promptInputProps,\n onValueChange:\n onValueChange || promptInputProps?.onValueChange\n ? (value: string) => {\n onValueChange?.(value);\n promptInputProps?.onValueChange?.(value);\n }\n : undefined,\n qa: resolveChatContainerQa(qaMap, 'promptInput', 'prompt-input') ?? promptInputProps?.qa,\n onSend: onSendMessage,\n onCancel,\n status,\n suggestionsProps,\n headerProps: buildFinalPromptInputHeaderProps({\n headerProps: promptInputProps?.headerProps,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputHeader', 'prompt-input-header') ??\n promptInputProps?.headerProps?.qa,\n }),\n bodyProps: {\n ...restBodyProps,\n placeholder:\n texts.promptPlaceholder || restBodyProps?.placeholder || i18n('prompt-placeholder'),\n // The remount that clears the draft on a new or a freshly picked chat also puts the\n // cursor in the field. On a touch device that raises the keyboard over half the\n // screen, so a consumer that asked for no auto focus is taken at its word and keeps\n // the clearing without the cursor.\n autoFocus: restBodyProps?.autoFocus ?? promptInputKey > 0,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputBody', 'prompt-input-body') ??\n restBodyProps?.qa,\n },\n footerProps: {\n ...promptInputProps?.footerProps,\n submitButtonTooltipSend:\n texts?.submitSendTooltip ?? promptInputProps?.footerProps?.submitButtonTooltipSend,\n submitButtonTooltipCancel:\n texts?.submitCancelTooltip ??\n promptInputProps?.footerProps?.submitButtonTooltipCancel,\n submitButtonCancelableText:\n texts?.submitButtonCancelableText ??\n promptInputProps?.footerProps?.submitButtonCancelableText,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputFooter', 'prompt-input-footer') ??\n promptInputProps?.footerProps?.qa,\n submitButtonQa:\n resolveChatContainerQa(qaMap, 'submitButton', 'submit-button') ??\n promptInputProps?.footerProps?.submitButtonQa,\n },\n };\n}\n\n/**\n * ChatContainer - fully assembled chat component, the main exportable component of the library.\n * Integrates Header, ChatContent, History and manages their state.\n *\n * @param props - component props\n * @returns React component\n */\nexport function ChatContainer(props: ChatContainerProps) {\n const {\n chats = [],\n messages = [],\n onSendMessage,\n onDeleteChat,\n onCancel,\n onRetry,\n status = 'ready',\n error = null,\n showActionsOnHover = false,\n contextItems = [],\n showContextIndicator,\n contextIndicatorProps,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxProps,\n messageListConfig,\n mascotConfig,\n headerProps = {},\n contentProps = {},\n emptyContainerProps = {},\n promptInputProps = {},\n disclaimerProps = {},\n historyProps = {},\n welcomeConfig,\n texts = {},\n hideTitleOnEmptyChat = false,\n isMobile: isMobileProp,\n adjustToKeyboard = true,\n floatingHeader = false,\n className,\n headerClassName,\n contentClassName,\n footerClassName,\n qa,\n } = props;\n\n const isMobileContext = useMobile();\n const isMobile = isMobileProp ?? isMobileContext;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLDivElement>(null);\n const footerRef = useRef<HTMLDivElement>(null);\n const viewportProbeRef = useRef<HTMLDivElement>(null);\n const isKeyboardTracked = isMobile && adjustToKeyboard;\n // Keeps the footer (prompt input + disclaimer) above the on-screen keyboard on iOS Safari,\n // where the layout viewport stays full-height while the keyboard is open.\n const {isKeyboardOpen, maxHeight} = useKeyboardViewportFit(rootRef, isKeyboardTracked, {\n viewportProbeRef,\n });\n // Меряем всегда, а не только при открытой клавиатуре: иначе на закрытой поле успевает\n // вырасти по своему счётчику строк, и на следующем открытии оно уже выше, чем доступное\n // место, а потолок к этому моменту снят\n const {promptInputMaxHeight, isHeroFitting} = useKeyboardLayoutFit(\n rootRef,\n headerRef,\n footerRef,\n isKeyboardTracked,\n );\n\n const hookState = useChatContainer(props);\n\n const mascotState = useChatContainerMascot({\n config: mascotConfig,\n view: hookState.chatContentView === 'empty' ? 'hero' : 'chat',\n status,\n messagesCount: messages.length,\n activeChatId: hookState.activeChat?.id,\n promptInputKey: hookState.promptInputKey,\n });\n\n const wrappedOnSendMessage = useCallback(\n async (...args: Parameters<typeof onSendMessage>) => {\n mascotState.notifyActivity();\n return onSendMessage(...args);\n },\n [mascotState.notifyActivity, onSendMessage],\n );\n const wrappedOnCancel = useMemo(() => {\n if (!onCancel) {\n return undefined;\n }\n return async () => {\n await onCancel();\n mascotState.handleCancelResolved();\n };\n }, [mascotState.handleCancelResolved, onCancel]);\n const wrappedOnRetry = useMemo(() => {\n if (!onRetry) {\n return undefined;\n }\n return () => {\n mascotState.notifyActivity();\n onRetry();\n };\n }, [mascotState.notifyActivity, onRetry]);\n\n const resolvedMascotAssets = useMemo(\n () => resolveMascotAssets(mascotConfig?.defaultAssets, mascotConfig?.assets),\n [mascotConfig?.assets, mascotConfig?.defaultAssets],\n );\n const resolvedMascots = useMemo(\n () => resolveMascotCollection(mascotConfig?.defaultMascots, mascotConfig?.mascots),\n [mascotConfig?.defaultMascots, mascotConfig?.mascots],\n );\n const mascotView = hookState.chatContentView === 'empty' ? 'hero' : 'chat';\n const mascotNode = useMemo(() => {\n if (!mascotConfig) {\n return undefined;\n }\n if (mascotView === 'hero' && mascotConfig.showOnWelcome === false) {\n return undefined;\n }\n if (mascotView === 'chat' && mascotConfig.showInChat === false) {\n return undefined;\n }\n const node = mascotConfig.renderMascot\n ? mascotConfig.renderMascot({\n view: mascotView,\n state: mascotState.state,\n animationType: getMascotAnimationType(mascotState.state),\n assets: resolvedMascotAssets,\n })\n : getMascotNode(resolvedMascots, mascotView, mascotState.state);\n if (node === undefined || node === null) {\n return undefined;\n }\n return <div className={b('mascot', {view: mascotView})}>{node}</div>;\n }, [mascotConfig, mascotState.state, mascotView, resolvedMascotAssets, resolvedMascots]);\n\n const qaMap = useMemo(() => normalizeChatContainerQa(qa), [qa]);\n\n // Collect i18n texts with overrides\n const headerTitle = useMemo(\n () =>\n texts.headerTitle ||\n headerProps.title ||\n hookState.activeChat?.name ||\n i18n('header-default-title'),\n [texts.headerTitle, headerProps.title, hookState.activeChat?.name],\n );\n\n // Determine if chat is empty\n const isChatEmpty = hookState.chatContentView === 'empty';\n\n // Calculate showTitle based on hideTitleOnEmptyChat option\n const showTitle = useMemo(() => {\n // If explicit showTitle is provided in headerProps, use it\n if (headerProps.showTitle !== undefined) {\n return headerProps.showTitle;\n }\n // If hideTitleOnEmptyChat is enabled, show title only when chat has messages\n if (hideTitleOnEmptyChat && isChatEmpty) {\n return false;\n }\n return true;\n }, [hideTitleOnEmptyChat, isChatEmpty, headerProps.showTitle]);\n\n // Build props for Header\n const finalHeaderProps = useMemo(() => {\n const actionQa: Partial<Record<HeaderAction, string>> = {\n ...headerProps.actionQa,\n };\n const setHeaderActionQa = (\n action: HeaderAction,\n key: 'headerNewChat' | 'headerHistory' | 'headerFolding' | 'headerClose',\n suffix: string,\n ) => {\n const resolved = resolveChatContainerQa(qaMap, key, suffix);\n if (resolved !== undefined) {\n actionQa[action] = resolved;\n }\n };\n setHeaderActionQa(HeaderAction.NewChat, 'headerNewChat', 'header-action-newChat');\n setHeaderActionQa(HeaderAction.History, 'headerHistory', 'header-action-history');\n setHeaderActionQa(HeaderAction.Folding, 'headerFolding', 'header-action-folding');\n setHeaderActionQa(HeaderAction.Close, 'headerClose', 'header-action-close');\n\n const actionTooltipTexts: NonNullable<HeaderProps['actionTooltipTexts']> = {\n [HeaderAction.NewChat]:\n texts.headerNewChatTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.NewChat],\n [HeaderAction.History]:\n texts.headerHistoryTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.History],\n [HeaderAction.Close]:\n texts.headerCloseTooltip ?? headerProps.actionTooltipTexts?.[HeaderAction.Close],\n [HeaderAction.Folding]: {\n collapsed:\n texts.headerFoldingCollapsedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.collapsed,\n opened:\n texts.headerFoldingOpenedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.opened,\n },\n };\n\n return {\n ...headerProps,\n title: headerTitle,\n showTitle,\n baseActions: hookState.baseActions,\n handleNewChat: hookState.handleNewChat,\n handleHistoryToggle: hookState.handleHistoryToggle,\n handleFolding: hookState.handleFolding,\n handleClose: hookState.handleClose,\n historyButtonRef: hookState.historyButtonRef,\n qa: resolveChatContainerQa(qaMap, 'header', 'header') ?? headerProps.qa,\n actionQa,\n actionTooltipTexts,\n menuButtonQa:\n resolveChatContainerQa(qaMap, 'headerMenuButton', 'header-menu-button') ??\n headerProps.menuButtonQa,\n menuButtonTooltip: texts.headerMenuTooltip ?? headerProps.menuButtonTooltip,\n menuItemQa: resolveHeaderMenuItemQa(\n qaMap,\n headerProps.menuItems,\n headerProps.menuItemQa,\n ),\n };\n }, [\n headerTitle,\n showTitle,\n hookState.baseActions,\n hookState.handleNewChat,\n hookState.handleHistoryToggle,\n hookState.handleFolding,\n hookState.handleClose,\n hookState.historyButtonRef,\n headerProps,\n qaMap,\n texts.headerNewChatTooltip,\n texts.headerHistoryTooltip,\n texts.headerCloseTooltip,\n texts.headerFoldingCollapsedTooltip,\n texts.headerFoldingOpenedTooltip,\n texts.headerMenuTooltip,\n ]);\n\n // Build props for EmptyContainer\n const finalEmptyContainerProps = useMemo(() => {\n const {showDefaultTitle = true, showDefaultDescription = true} = welcomeConfig || {};\n\n return {\n ...emptyContainerProps,\n qa:\n resolveChatContainerQa(qaMap, 'emptyState', 'empty-state') ??\n emptyContainerProps.qa,\n image: welcomeConfig?.image,\n title:\n texts.emptyStateTitle ??\n welcomeConfig?.title ??\n emptyContainerProps.title ??\n (showDefaultTitle ? i18n('empty-state-title') : undefined),\n description:\n texts.emptyStateDescription ??\n welcomeConfig?.description ??\n emptyContainerProps.description ??\n (showDefaultDescription ? i18n('empty-state-description') : undefined),\n suggestionTitle:\n texts.emptyStateSuggestionsTitle ??\n welcomeConfig?.suggestionTitle ??\n emptyContainerProps.suggestionTitle,\n suggestions: welcomeConfig?.suggestions,\n alignment: {\n ...emptyContainerProps.alignment,\n ...welcomeConfig?.alignment,\n ...(mascotView === 'hero' &&\n mascotNode &&\n emptyContainerProps.alignment?.hero === undefined &&\n welcomeConfig?.alignment?.hero === undefined\n ? {hero: 'center' as const}\n : {}),\n },\n heroContent:\n emptyContainerProps.heroContent ?? (mascotView === 'hero' ? mascotNode : undefined),\n layout: welcomeConfig?.layout ?? emptyContainerProps.layout,\n wrapText: welcomeConfig?.wrapText ?? emptyContainerProps.wrapText,\n showMore: welcomeConfig?.showMore,\n showMoreText:\n texts.emptyStateShowMoreText ??\n welcomeConfig?.showMoreText ??\n emptyContainerProps.showMoreText ??\n i18n('empty-state-show-more'),\n onSuggestionClick: async (\n content: string,\n suggestionId?: string,\n suggestionData?: Record<string, unknown>,\n ) => {\n const suggestion = toSuggestionContext(suggestionId, suggestionData);\n\n await wrappedOnSendMessage({\n content,\n ...(suggestion && {suggestion}),\n });\n },\n };\n }, [\n welcomeConfig,\n emptyContainerProps,\n wrappedOnSendMessage,\n qaMap,\n texts.emptyStateTitle,\n texts.emptyStateDescription,\n texts.emptyStateSuggestionsTitle,\n texts.emptyStateShowMoreText,\n mascotNode,\n mascotView,\n ]);\n\n // Build props for MessageList\n const messageListProps = useMemo(\n () => ({\n ...messageListConfig,\n messages,\n status,\n errorMessage: texts.errorText\n ? {...(messageListConfig?.errorMessage ?? {}), text: texts.errorText}\n : messageListConfig?.errorMessage || (error ? {text: error.message} : undefined),\n onRetry: wrappedOnRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxProps,\n qa:\n resolveChatContainerQa(qaMap, 'messageList', 'message-list') ??\n messageListConfig?.qa,\n actionPopupProps: {\n ...messageListConfig?.actionPopupProps,\n qa:\n resolveChatContainerQa(qaMap, 'actionPopup', 'action-popup') ??\n messageListConfig?.actionPopupProps?.qa,\n },\n footerContent:\n mascotView === 'chat' && mascotNode !== undefined && mascotNode !== null ? (\n <Fragment>\n {messageListConfig?.footerContent}\n {mascotNode}\n </Fragment>\n ) : (\n messageListConfig?.footerContent\n ),\n }),\n [\n messages,\n status,\n error,\n wrappedOnRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxProps,\n messageListConfig,\n qaMap,\n texts.errorText,\n mascotNode,\n mascotView,\n ],\n );\n\n // Build props for PromptInput\n const finalPromptInputProps = useMemo(\n () =>\n buildFinalPromptInputProps({\n promptInputProps,\n onSendMessage: wrappedOnSendMessage,\n onCancel: wrappedOnCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts,\n promptInputKey: hookState.promptInputKey,\n qaMap,\n onValueChange: mascotConfig ? mascotState.handleValueChange : undefined,\n }),\n [\n wrappedOnSendMessage,\n wrappedOnCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n promptInputProps,\n hookState.promptInputKey,\n qaMap,\n texts.promptPlaceholder,\n texts.promptSuggestTitle,\n texts.submitSendTooltip,\n texts.submitCancelTooltip,\n texts.submitButtonCancelableText,\n mascotState.handleValueChange,\n mascotConfig,\n ],\n );\n\n // Build props for Disclaimer\n const finalDisclaimerProps = useMemo(() => {\n const disclaimerText =\n texts.disclaimerText ?? disclaimerProps.text ?? i18n('disclaimer-text');\n\n return {\n ...disclaimerProps,\n text: disclaimerText,\n qa: resolveChatContainerQa(qaMap, 'disclaimer', 'disclaimer') ?? disclaimerProps.qa,\n };\n }, [disclaimerProps, qaMap, texts.disclaimerText]);\n\n // Build props for ChatContent\n const finalContentProps = useMemo(\n () => ({\n ...contentProps,\n qa: resolveChatContainerQa(qaMap, 'content', 'content') ?? contentProps.qa,\n view: hookState.chatContentView as 'empty' | 'chat',\n emptyContainerProps: finalEmptyContainerProps,\n messageListProps,\n }),\n [\n hookState.chatContentView,\n finalEmptyContainerProps,\n messageListProps,\n contentProps,\n qaMap,\n ],\n );\n\n // Build props for History\n const finalHistoryProps = useMemo(\n () => ({\n ...historyProps,\n qa: resolveChatContainerQa(qaMap, 'history', 'history') ?? historyProps.qa,\n chats,\n selectedChat: hookState.activeChat,\n onSelectChat: hookState.handleSelectChat,\n onDeleteChat,\n open: hookState.isHistoryOpen,\n onOpenChange: (open: boolean) => {\n historyProps.onOpenChange?.(open);\n hookState.handleHistoryOpenChange(open);\n },\n anchorElement: hookState.historyButtonRef.current,\n emptyPlaceholder:\n texts.historyEmptyPlaceholder ??\n historyProps.emptyPlaceholder ??\n i18n('history-empty'),\n emptyFilteredPlaceholder:\n texts.historyEmptyFilteredPlaceholder ??\n historyProps.emptyFilteredPlaceholder ??\n i18n('history-empty-filtered'),\n searchPlaceholder: texts.historySearchPlaceholder ?? historyProps.searchPlaceholder,\n }),\n [\n chats,\n hookState.activeChat,\n hookState.handleSelectChat,\n onDeleteChat,\n hookState.isHistoryOpen,\n hookState.handleHistoryOpenChange,\n hookState.historyButtonRef,\n historyProps,\n qaMap,\n texts.historyEmptyPlaceholder,\n texts.historyEmptyFilteredPlaceholder,\n texts.historySearchPlaceholder,\n ],\n );\n\n const showFooter = finalPromptInputProps || finalDisclaimerProps;\n\n const rootStyle = useMemo<CSSProperties | undefined>(() => {\n if (maxHeight === undefined && promptInputMaxHeight === undefined && isHeroFitting) {\n return undefined;\n }\n\n return {\n ...(maxHeight === undefined ? undefined : {maxHeight}),\n ...(promptInputMaxHeight === undefined\n ? undefined\n : {\n '--g-aikit-prompt-input-body-textarea-max-height': `${promptInputMaxHeight}px`,\n }),\n ...(isHeroFitting\n ? undefined\n : {'--g-aikit-empty-container-hero-visibility': 'hidden'}),\n } as CSSProperties;\n }, [maxHeight, promptInputMaxHeight, isHeroFitting]);\n\n return (\n <MobileProvider mobile={isMobile}>\n <div\n ref={rootRef}\n className={b(\n {\n mobile: isMobile,\n 'keyboard-open': isKeyboardOpen,\n 'floating-header': floatingHeader,\n },\n className,\n )}\n style={rootStyle}\n data-qa={resolveChatContainerRootQa(qaMap)}\n >\n {isKeyboardTracked && (\n <div className={b('viewport-probe')} ref={viewportProbeRef} aria-hidden />\n )}\n <div className={b('header', headerClassName)} ref={headerRef}>\n <Header {...finalHeaderProps} />\n </div>\n <div className={b('content', {view: hookState.chatContentView}, contentClassName)}>\n <ChatContent {...finalContentProps} />\n </div>\n {showFooter && (\n <div\n className={b('footer', {view: hookState.chatContentView}, footerClassName)}\n ref={footerRef}\n >\n {finalPromptInputProps && (\n <PromptInput\n key={hookState.promptInputKey}\n {...finalPromptInputProps}\n />\n )}\n {finalDisclaimerProps && <Disclaimer {...finalDisclaimerProps} />}\n </div>\n )}\n {/* History is integrated via popup anchored to button in Header */}\n <History {...finalHistoryProps} />\n </div>\n </MobileProvider>\n );\n}\n"]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
|
+
export interface PromptInputFitMetrics {
|
|
3
|
+
/** Height the whole chat is allowed to take. */
|
|
4
|
+
rootHeight: number;
|
|
5
|
+
/** Height of the header the prompt input must not grow into. */
|
|
6
|
+
headerHeight: number;
|
|
7
|
+
/** Height of everything the footer holds besides the field itself. */
|
|
8
|
+
footerChromeHeight: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Height the textarea may take before the footer starts pushing the chat out of the visible area.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolvePromptInputMaxHeight({ rootHeight, headerHeight, footerChromeHeight, }: PromptInputFitMetrics): number;
|
|
14
|
+
export interface FooterChromeMetrics {
|
|
15
|
+
/** Height the footer takes right now. */
|
|
16
|
+
footerHeight: number;
|
|
17
|
+
/** Height of the autosized textarea inside it. */
|
|
18
|
+
textareaHeight: number;
|
|
19
|
+
/** Furniture height from the last measurement, `undefined` before the first one. */
|
|
20
|
+
lastChromeHeight?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Whether the furniture has to be measured again rather than taken from the last measurement.
|
|
24
|
+
*
|
|
25
|
+
* Subtracting the field from the footer gives the furniture only while nothing is squeezed. A
|
|
26
|
+
* footer that no longer fits is squeezed by the layout around it - it is allowed to be, so that the
|
|
27
|
+
* suggestions can give their space back - and so is the prompt input inside it, while the field
|
|
28
|
+
* keeps the height it grew to; what is squeezed spills over what comes after it instead of pushing
|
|
29
|
+
* it down, so the disclaimer ends up under the row of buttons and every box still measures as if it
|
|
30
|
+
* fitted. The subtraction then comes back short, never long: a shorter answer is the squeeze, a
|
|
31
|
+
* longer one is furniture that really has grown - a wrapped disclaimer, an attachment - and only
|
|
32
|
+
* that is worth a fresh measurement.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getIsFooterChromeStale({ footerHeight, textareaHeight, lastChromeHeight, }: FooterChromeMetrics): boolean;
|
|
35
|
+
export interface FooterChromeState {
|
|
36
|
+
measured: number;
|
|
37
|
+
lastChromeHeight?: number;
|
|
38
|
+
pendingChromeHeight?: number;
|
|
39
|
+
}
|
|
40
|
+
export interface FooterChromeDecision {
|
|
41
|
+
chromeHeight: number;
|
|
42
|
+
pendingChromeHeight?: number;
|
|
43
|
+
}
|
|
44
|
+
export declare function resolveFooterChromeHeight({ measured, lastChromeHeight, pendingChromeHeight, }: FooterChromeState): FooterChromeDecision;
|
|
45
|
+
export interface HeroFitMetrics {
|
|
46
|
+
/** Height left for the welcome content, padding excluded. */
|
|
47
|
+
availableHeight: number;
|
|
48
|
+
/** Height of the hero block, the same whatever the space around it. */
|
|
49
|
+
heroHeight: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Whether the welcome hero still fits. A growing prompt input eats the welcome screen from the
|
|
53
|
+
* bottom up, and a hero cut in half reads as broken, so it is hidden as soon as it stops fitting.
|
|
54
|
+
*/
|
|
55
|
+
export declare function getIsHeroFitting({ availableHeight, heroHeight }: HeroFitMetrics): boolean;
|
|
56
|
+
export interface KeyboardLayoutFit {
|
|
57
|
+
/** Cap for the autosized textarea, `undefined` while it does not need one. */
|
|
58
|
+
promptInputMaxHeight?: number;
|
|
59
|
+
/** `false` when the welcome hero has to give way to the prompt input. */
|
|
60
|
+
isHeroFitting: boolean;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Keeps the chat usable while the on-screen keyboard is open: measures how tall the prompt input
|
|
64
|
+
* may grow before it pushes the chat past the bottom of the visible area, and whether the welcome
|
|
65
|
+
* hero still has room above it.
|
|
66
|
+
*
|
|
67
|
+
* An autosized textarea sets its own inline height from the text it holds, so without a limit a
|
|
68
|
+
* long draft covers the whole screen; with one, the text scrolls inside the field instead.
|
|
69
|
+
*
|
|
70
|
+
* @param rootRef - chat root, already clamped to the visible area
|
|
71
|
+
* @param headerRef - chat header the input must stay below
|
|
72
|
+
* @param footerRef - chat footer holding the prompt input
|
|
73
|
+
* @param enabled - disables measuring (e.g. while the keyboard is closed)
|
|
74
|
+
*/
|
|
75
|
+
export declare function useKeyboardLayoutFit(rootRef: RefObject<HTMLElement | null>, headerRef: RefObject<HTMLElement | null>, footerRef: RefObject<HTMLElement | null>, enabled: boolean): KeyboardLayoutFit;
|