@gravity-ui/aikit 2.20.2 → 2.20.3-beta.13c5cd07a4faac84dbd19cdf5946348901c9b28c.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 (52) hide show
  1. package/build/cjs/components/atoms/MarkdownRenderer/MarkdownRenderer.css +1 -0
  2. package/build/cjs/components/molecules/PromptInputBody/PromptInputBody.css +2 -0
  3. package/build/cjs/components/molecules/Tabs/Tabs.css +1 -0
  4. package/build/cjs/components/organisms/FileUploadDialog/FileUploadDialog.css +1 -0
  5. package/build/cjs/components/organisms/MessageList/MessageList.css +2 -0
  6. package/build/cjs/components/pages/ChatContainer/ChatContainer.css +27 -0
  7. package/build/cjs/components/pages/ChatContainer/ChatContainer.js +33 -5
  8. package/build/cjs/components/pages/ChatContainer/ChatContainer.js.map +1 -1
  9. package/build/cjs/components/pages/ChatContainer/useKeyboardLayoutFit.d.ts +86 -0
  10. package/build/cjs/components/pages/ChatContainer/useKeyboardLayoutFit.js +149 -0
  11. package/build/cjs/components/pages/ChatContainer/useKeyboardLayoutFit.js.map +1 -0
  12. package/build/cjs/components/templates/EmptyContainer/EmptyContainer.css +5 -1
  13. package/build/cjs/components/templates/History/History.css +1 -0
  14. package/build/cjs/hooks/useKeyboardViewportFit.d.ts +51 -2
  15. package/build/cjs/hooks/useKeyboardViewportFit.js +61 -7
  16. package/build/cjs/hooks/useKeyboardViewportFit.js.map +1 -1
  17. package/build/cjs/package.json +1 -1
  18. package/build/cjs/themes/common.css +8 -0
  19. package/build/cjs/themes/variables.css +8 -0
  20. package/build/docs/INDEX.md +1 -1
  21. package/build/docs/components/atoms/MarkdownRenderer.md +5 -4
  22. package/build/docs/components/molecules/PromptInputBody.md +5 -3
  23. package/build/docs/components/molecules/Tabs.md +1 -0
  24. package/build/docs/components/organisms/MessageList.md +4 -3
  25. package/build/docs/components/pages/ChatContainer.md +72 -24
  26. package/build/docs/components/templates/EmptyContainer.md +21 -18
  27. package/build/docs/components/templates/History.md +11 -10
  28. package/build/docs/guides/HOOKS.md +61 -1
  29. package/build/docs/guides/THEMING.md +39 -24
  30. package/build/esm/components/atoms/MarkdownRenderer/MarkdownRenderer.css +1 -0
  31. package/build/esm/components/molecules/PromptInputBody/PromptInputBody.css +2 -0
  32. package/build/esm/components/molecules/Tabs/Tabs.css +1 -0
  33. package/build/esm/components/organisms/FileUploadDialog/FileUploadDialog.css +1 -0
  34. package/build/esm/components/organisms/MessageList/MessageList.css +2 -0
  35. package/build/esm/components/pages/ChatContainer/ChatContainer.css +27 -0
  36. package/build/esm/components/pages/ChatContainer/ChatContainer.js +33 -5
  37. package/build/esm/components/pages/ChatContainer/ChatContainer.js.map +1 -1
  38. package/build/esm/components/pages/ChatContainer/useKeyboardLayoutFit.d.ts +86 -0
  39. package/build/esm/components/pages/ChatContainer/useKeyboardLayoutFit.js +142 -0
  40. package/build/esm/components/pages/ChatContainer/useKeyboardLayoutFit.js.map +1 -0
  41. package/build/esm/components/templates/EmptyContainer/EmptyContainer.css +5 -1
  42. package/build/esm/components/templates/History/History.css +1 -0
  43. package/build/esm/hooks/useKeyboardViewportFit.d.ts +51 -2
  44. package/build/esm/hooks/useKeyboardViewportFit.js +59 -6
  45. package/build/esm/hooks/useKeyboardViewportFit.js.map +1 -1
  46. package/build/esm/package.json +1 -1
  47. package/build/esm/themes/common.css +8 -0
  48. package/build/esm/themes/variables.css +8 -0
  49. package/docs/HOOKS.md +61 -1
  50. package/docs/THEMING.md +39 -24
  51. package/llms-full.txt +100 -25
  52. package/package.json +1 -1
@@ -97,6 +97,7 @@
97
97
  max-width: 100%;
98
98
  min-width: 0;
99
99
  overflow-x: auto;
100
+ overscroll-behavior-x: var(--g-aikit-scroll-overscroll-behavior, auto);
100
101
  }
101
102
  .g-aikit-markdown-renderer {
102
103
  /*
@@ -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;
@@ -5,6 +5,7 @@
5
5
  align-items: flex-start;
6
6
  gap: var(--g-spacing-2);
7
7
  overflow: scroll hidden;
8
+ overscroll-behavior-x: var(--g-aikit-scroll-overscroll-behavior, auto);
8
9
  white-space: nowrap;
9
10
  padding: var(--g-spacing-1) 0;
10
11
  scrollbar-width: thin;
@@ -8,5 +8,6 @@
8
8
  gap: var(--g-spacing-1);
9
9
  max-height: 240px;
10
10
  overflow-y: auto;
11
+ overscroll-behavior: var(--g-aikit-scroll-overscroll-behavior, auto);
11
12
  margin-top: var(--g-spacing-4);
12
13
  }
@@ -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 _r = (_a = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.bodyProps) !== null && _a !== void 0 ? _a : {}, { autoFocusOnNewChat: _autoFocusOnNewChat, autoFocusOnChatSelect: _autoFocusOnChatSelect } = _r, restBodyProps = tslib_1.__rest(_r, ["autoFocusOnNewChat", "autoFocusOnChatSelect"]);
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'), autoFocus: promptInputKey > 0 || (restBodyProps === null || restBodyProps === void 0 ? void 0 : restBodyProps.autoFocus), qa: (_e = (0, chatContainerQa_1.resolveChatContainerQa)(qaMap, 'promptInputBody', 'prompt-input-body')) !== null && _e !== void 0 ? _e : restBodyProps === null || restBodyProps === void 0 ? void 0 : restBodyProps.qa }), footerProps: Object.assign(Object.assign({}, promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps), { submitButtonTooltipSend: (_f = texts === null || texts === void 0 ? void 0 : texts.submitSendTooltip) !== null && _f !== void 0 ? _f : (_g = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps) === null || _g === void 0 ? void 0 : _g.submitButtonTooltipSend, submitButtonTooltipCancel: (_h = texts === null || texts === void 0 ? void 0 : texts.submitCancelTooltip) !== null && _h !== void 0 ? _h : (_j = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps) === null || _j === void 0 ? void 0 : _j.submitButtonTooltipCancel, submitButtonCancelableText: (_k = texts === null || texts === void 0 ? void 0 : texts.submitButtonCancelableText) !== null && _k !== void 0 ? _k : (_l = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps) === null || _l === void 0 ? void 0 : _l.submitButtonCancelableText, qa: (_m = (0, chatContainerQa_1.resolveChatContainerQa)(qaMap, 'promptInputFooter', 'prompt-input-footer')) !== null && _m !== void 0 ? _m : (_o = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps) === null || _o === void 0 ? void 0 : _o.qa, submitButtonQa: (_p = (0, chatContainerQa_1.resolveChatContainerQa)(qaMap, 'submitButton', 'submit-button')) !== null && _p !== void 0 ? _p : (_q = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.footerProps) === null || _q === void 0 ? void 0 : _q.submitButtonQa }) });
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, isMobile && adjustToKeyboard);
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: maxHeight === undefined ? undefined : { maxHeight }, "data-qa": (0, chatContainerQa_1.resolveChatContainerRootQa)(qaMap), children: [(0, jsx_runtime_1.jsx)("div", { className: b('header', headerClassName), 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), 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))] }) }));
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,86 @@
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
+ /** Furniture the footer shows right now, footer minus the field. */
37
+ measured: number;
38
+ /** Furniture the limit is currently built on, `undefined` before the first measurement. */
39
+ lastChromeHeight?: number;
40
+ /** Measurement waiting for a second, matching one before it is adopted. */
41
+ pendingChromeHeight?: number;
42
+ }
43
+ export interface FooterChromeDecision {
44
+ chromeHeight: number;
45
+ pendingChromeHeight?: number;
46
+ }
47
+ /**
48
+ * Furniture height to build the limit on, and the measurement still waiting for confirmation.
49
+ *
50
+ * Growth is adopted only once a second measurement agrees with it, because a footer caught
51
+ * mid-squeeze reports furniture that is not there. Shrinking is adopted at once: a smaller
52
+ * subtraction can only mean the footer really did lose furniture, and a value that could only ever
53
+ * grow would latch on the first spike and drive the limit to zero, collapsing the field.
54
+ */
55
+ export declare function resolveFooterChromeHeight({ measured, lastChromeHeight, pendingChromeHeight, }: FooterChromeState): FooterChromeDecision;
56
+ export interface HeroFitMetrics {
57
+ /** Height left for the welcome content, padding excluded. */
58
+ availableHeight: number;
59
+ /** Height of the hero block, the same whatever the space around it. */
60
+ heroHeight: number;
61
+ }
62
+ /**
63
+ * Whether the welcome hero still fits. A growing prompt input eats the welcome screen from the
64
+ * bottom up, and a hero cut in half reads as broken, so it is hidden as soon as it stops fitting.
65
+ */
66
+ export declare function getIsHeroFitting({ availableHeight, heroHeight }: HeroFitMetrics): boolean;
67
+ export interface KeyboardLayoutFit {
68
+ /** Cap for the autosized textarea, `undefined` while it does not need one. */
69
+ promptInputMaxHeight?: number;
70
+ /** `false` when the welcome hero has to give way to the prompt input. */
71
+ isHeroFitting: boolean;
72
+ }
73
+ /**
74
+ * Keeps the chat usable while the on-screen keyboard is open: measures how tall the prompt input
75
+ * may grow before it pushes the chat past the bottom of the visible area, and whether the welcome
76
+ * hero still has room above it.
77
+ *
78
+ * An autosized textarea sets its own inline height from the text it holds, so without a limit a
79
+ * long draft covers the whole screen; with one, the text scrolls inside the field instead.
80
+ *
81
+ * @param rootRef - chat root, already clamped to the visible area
82
+ * @param headerRef - chat header the input must stay below
83
+ * @param footerRef - chat footer holding the prompt input
84
+ * @param enabled - disables measuring (e.g. while the keyboard is closed)
85
+ */
86
+ export declare function useKeyboardLayoutFit(rootRef: RefObject<HTMLElement | null>, headerRef: RefObject<HTMLElement | null>, footerRef: RefObject<HTMLElement | null>, enabled: boolean): KeyboardLayoutFit;