@gravity-ui/aikit 2.20.2 → 2.20.3-beta.0219026dcfeed7e730d6b8ba40982e9e40329042.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 +75 -0
  10. package/build/cjs/components/pages/ChatContainer/useKeyboardLayoutFit.js +141 -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 +75 -0
  39. package/build/esm/components/pages/ChatContainer/useKeyboardLayoutFit.js +134 -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
+ // Measured at all times, not only while the keyboard is open: otherwise the field grows by
101
+ // its own row counter while the keyboard is away, and by the next time it comes back the
102
+ // field is already taller than the space left, with the cap long gone.
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 // Measured at all times, not only while the keyboard is open: otherwise the field grows by\n // its own row counter while the keyboard is away, and by the next time it comes back the\n // field is already taller than the space left, with the cap long gone.\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;