@memori.ai/memori-react 9.0.0-alpha.16 → 9.0.0-alpha.18

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 (186) hide show
  1. package/CHANGELOG.md +4 -6944
  2. package/dist/components/Chat/Chat.css +11 -15
  3. package/dist/components/Chat/Chat.js +11 -3
  4. package/dist/components/Chat/Chat.js.map +1 -1
  5. package/dist/components/ChatBubble/ChatBubble.css +96 -22
  6. package/dist/components/ChatBubble/ChatBubble.js +31 -2
  7. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  8. package/dist/components/ChatHistoryDrawer/ChatHistory.css +1 -0
  9. package/dist/components/ChatInputs/ChatInputs.css +72 -147
  10. package/dist/components/ChatInputs/ChatInputs.js +3 -4
  11. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  12. package/dist/components/Header/ChatConsumptionDropdown.js +2 -1
  13. package/dist/components/Header/ChatConsumptionDropdown.js.map +1 -1
  14. package/dist/components/Header/Header.css +199 -34
  15. package/dist/components/Header/Header.d.ts +1 -0
  16. package/dist/components/Header/Header.js +42 -34
  17. package/dist/components/Header/Header.js.map +1 -1
  18. package/dist/components/IconButton/IconButton.css +144 -0
  19. package/dist/components/IconButton/IconButton.d.ts +9 -0
  20. package/dist/components/IconButton/IconButton.js +36 -0
  21. package/dist/components/IconButton/IconButton.js.map +1 -0
  22. package/dist/components/KnownFacts/KnownFacts.css +22 -9
  23. package/dist/components/KnownFacts/KnownFacts.js +13 -4
  24. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  25. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +29 -44
  26. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +3 -2
  27. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  28. package/dist/components/MemoriWidget/MemoriWidget.css +2 -1
  29. package/dist/components/MemoriWidget/MemoriWidget.js +27 -30
  30. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  31. package/dist/components/MicrophoneButton/MicrophoneButton.css +2 -183
  32. package/dist/components/MicrophoneButton/MicrophoneButton.js +3 -1
  33. package/dist/components/MicrophoneButton/MicrophoneButton.js.map +1 -1
  34. package/dist/components/MobileSessionPanel/MobileSessionPanel.css +22 -7
  35. package/dist/components/MobileSessionPanel/MobileSessionPanel.d.ts +1 -0
  36. package/dist/components/MobileSessionPanel/MobileSessionPanel.js +6 -4
  37. package/dist/components/MobileSessionPanel/MobileSessionPanel.js.map +1 -1
  38. package/dist/components/PositionPopover/PositionPopover.d.ts +2 -0
  39. package/dist/components/PositionPopover/PositionPopover.js +18 -4
  40. package/dist/components/PositionPopover/PositionPopover.js.map +1 -1
  41. package/dist/components/ShareButton/ShareButton.css +3 -2
  42. package/dist/components/ShareButton/ShareButton.js +3 -2
  43. package/dist/components/ShareButton/ShareButton.js.map +1 -1
  44. package/dist/components/UploadButton/UploadButton.css +2 -20
  45. package/dist/components/UploadButton/UploadButton.js +2 -1
  46. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  47. package/dist/components/layouts/Chat.js +59 -73
  48. package/dist/components/layouts/Chat.js.map +1 -1
  49. package/dist/components/layouts/FullPage.js +53 -34
  50. package/dist/components/layouts/FullPage.js.map +1 -1
  51. package/dist/components/layouts/HiddenChat.js +3 -3
  52. package/dist/components/layouts/HiddenChat.js.map +1 -1
  53. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js +3 -3
  54. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  55. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +28 -15
  56. package/dist/components/layouts/ZoomedFullBody.js +53 -34
  57. package/dist/components/layouts/ZoomedFullBody.js.map +1 -1
  58. package/dist/components/layouts/chat.css +76 -41
  59. package/dist/components/layouts/fullpage.css +18 -9
  60. package/dist/components/layouts/hidden-chat.css +45 -69
  61. package/dist/components/layouts/zoomed-full-body.css +6 -5
  62. package/dist/helpers/positionPopover.d.ts +1 -1
  63. package/dist/helpers/positionPopover.js +2 -2
  64. package/dist/helpers/positionPopover.js.map +1 -1
  65. package/dist/styles.css +1 -1
  66. package/dist/version.d.ts +1 -1
  67. package/dist/version.js +1 -1
  68. package/esm/components/Chat/Chat.css +11 -15
  69. package/esm/components/Chat/Chat.js +11 -3
  70. package/esm/components/Chat/Chat.js.map +1 -1
  71. package/esm/components/ChatBubble/ChatBubble.css +96 -22
  72. package/esm/components/ChatBubble/ChatBubble.js +31 -2
  73. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  74. package/esm/components/ChatHistoryDrawer/ChatHistory.css +1 -0
  75. package/esm/components/ChatInputs/ChatInputs.css +72 -147
  76. package/esm/components/ChatInputs/ChatInputs.js +3 -4
  77. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  78. package/esm/components/Header/ChatConsumptionDropdown.js +3 -2
  79. package/esm/components/Header/ChatConsumptionDropdown.js.map +1 -1
  80. package/esm/components/Header/Header.css +199 -34
  81. package/esm/components/Header/Header.d.ts +1 -0
  82. package/esm/components/Header/Header.js +42 -34
  83. package/esm/components/Header/Header.js.map +1 -1
  84. package/esm/components/IconButton/IconButton.css +144 -0
  85. package/esm/components/IconButton/IconButton.d.ts +9 -0
  86. package/esm/components/IconButton/IconButton.js +33 -0
  87. package/esm/components/IconButton/IconButton.js.map +1 -0
  88. package/esm/components/KnownFacts/KnownFacts.css +22 -9
  89. package/esm/components/KnownFacts/KnownFacts.js +13 -4
  90. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  91. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +29 -44
  92. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +3 -2
  93. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  94. package/esm/components/MemoriWidget/MemoriWidget.css +2 -1
  95. package/esm/components/MemoriWidget/MemoriWidget.js +27 -30
  96. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  97. package/esm/components/MicrophoneButton/MicrophoneButton.css +2 -183
  98. package/esm/components/MicrophoneButton/MicrophoneButton.js +3 -2
  99. package/esm/components/MicrophoneButton/MicrophoneButton.js.map +1 -1
  100. package/esm/components/MobileSessionPanel/MobileSessionPanel.css +22 -7
  101. package/esm/components/MobileSessionPanel/MobileSessionPanel.d.ts +1 -0
  102. package/esm/components/MobileSessionPanel/MobileSessionPanel.js +6 -4
  103. package/esm/components/MobileSessionPanel/MobileSessionPanel.js.map +1 -1
  104. package/esm/components/PositionPopover/PositionPopover.d.ts +2 -0
  105. package/esm/components/PositionPopover/PositionPopover.js +18 -4
  106. package/esm/components/PositionPopover/PositionPopover.js.map +1 -1
  107. package/esm/components/ShareButton/ShareButton.css +3 -2
  108. package/esm/components/ShareButton/ShareButton.js +4 -3
  109. package/esm/components/ShareButton/ShareButton.js.map +1 -1
  110. package/esm/components/UploadButton/UploadButton.css +2 -20
  111. package/esm/components/UploadButton/UploadButton.js +2 -1
  112. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  113. package/esm/components/layouts/Chat.js +62 -76
  114. package/esm/components/layouts/Chat.js.map +1 -1
  115. package/esm/components/layouts/FullPage.js +54 -35
  116. package/esm/components/layouts/FullPage.js.map +1 -1
  117. package/esm/components/layouts/HiddenChat.js +3 -3
  118. package/esm/components/layouts/HiddenChat.js.map +1 -1
  119. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js +3 -3
  120. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  121. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +28 -15
  122. package/esm/components/layouts/ZoomedFullBody.js +54 -35
  123. package/esm/components/layouts/ZoomedFullBody.js.map +1 -1
  124. package/esm/components/layouts/chat.css +76 -41
  125. package/esm/components/layouts/fullpage.css +18 -9
  126. package/esm/components/layouts/hidden-chat.css +45 -69
  127. package/esm/components/layouts/zoomed-full-body.css +6 -5
  128. package/esm/helpers/positionPopover.d.ts +1 -1
  129. package/esm/helpers/positionPopover.js +2 -2
  130. package/esm/helpers/positionPopover.js.map +1 -1
  131. package/esm/styles.css +1 -1
  132. package/esm/version.d.ts +1 -1
  133. package/esm/version.js +1 -1
  134. package/package.json +1 -1
  135. package/src/components/Chat/Chat.css +11 -15
  136. package/src/components/Chat/Chat.tsx +13 -2
  137. package/src/components/ChatBubble/ChatBubble.css +96 -22
  138. package/src/components/ChatBubble/ChatBubble.tsx +39 -0
  139. package/src/components/ChatHistoryDrawer/ChatHistory.css +1 -0
  140. package/src/components/ChatInputs/ChatInputs.css +72 -147
  141. package/src/components/ChatInputs/ChatInputs.tsx +7 -7
  142. package/src/components/Header/ChatConsumptionDropdown.tsx +3 -2
  143. package/src/components/Header/Header.css +199 -34
  144. package/src/components/Header/Header.tsx +120 -100
  145. package/src/components/Header/__snapshots__/Header.test.tsx.snap +90 -57
  146. package/src/components/IconButton/IconButton.css +144 -0
  147. package/src/components/IconButton/IconButton.tsx +89 -0
  148. package/src/components/KnownFacts/KnownFacts.css +22 -9
  149. package/src/components/KnownFacts/KnownFacts.tsx +13 -3
  150. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +29 -44
  151. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +11 -20
  152. package/src/components/MemoriWidget/MemoriWidget.css +2 -1
  153. package/src/components/MemoriWidget/MemoriWidget.tsx +38 -31
  154. package/src/components/MicrophoneButton/MicrophoneButton.css +2 -183
  155. package/src/components/MicrophoneButton/MicrophoneButton.tsx +5 -5
  156. package/src/components/MobileSessionPanel/MobileSessionPanel.css +22 -7
  157. package/src/components/MobileSessionPanel/MobileSessionPanel.tsx +8 -6
  158. package/src/components/PositionPopover/PositionPopover.tsx +30 -4
  159. package/src/components/ShareButton/ShareButton.css +3 -2
  160. package/src/components/ShareButton/ShareButton.tsx +8 -9
  161. package/src/components/ShareButton/__snapshots__/ShareButton.test.tsx.snap +9 -9
  162. package/src/components/StartPanel/StartPanel.stories.tsx +1 -1
  163. package/src/components/UploadButton/UploadButton.css +2 -20
  164. package/src/components/UploadButton/UploadButton.tsx +3 -5
  165. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +29 -25
  166. package/src/components/layouts/Chat.tsx +210 -232
  167. package/src/components/layouts/FullPage.tsx +61 -40
  168. package/src/components/layouts/HiddenChat.tsx +5 -6
  169. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.tsx +2 -2
  170. package/src/components/layouts/WebsiteAssistant/__snapshots__/WebsiteAssistant.test.tsx.snap +2 -0
  171. package/src/components/layouts/WebsiteAssistant/website-assistant.css +28 -15
  172. package/src/components/layouts/ZoomedFullBody.tsx +61 -40
  173. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +145 -143
  174. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +22 -18
  175. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +10 -145
  176. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +12 -10
  177. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +11 -9
  178. package/src/components/layouts/chat.css +76 -41
  179. package/src/components/layouts/fullpage.css +18 -9
  180. package/src/components/layouts/hidden-chat.css +45 -69
  181. package/src/components/layouts/layouts.stories.tsx +1 -1
  182. package/src/components/layouts/zoomed-full-body.css +6 -5
  183. package/src/helpers/positionPopover.test.ts +10 -4
  184. package/src/helpers/positionPopover.ts +8 -5
  185. package/src/styles.css +1 -0
  186. package/src/version.ts +1 -1
@@ -21,34 +21,38 @@ exports[`renders UploadButton unchanged 1`] = `
21
21
  >
22
22
  <button
23
23
  aria-label="upload.uploadFilesOrImages"
24
- class="memori-button memori-button--circle memori-button--icon-only memori-share-button--button memori--conversation-button memori--unified-upload-button"
24
+ class="memori-button memori-button--toolbar memori-button--sm memori-icon-button memori-icon-button--labeled memori-share-button--button memori--conversation-button memori--unified-upload-button"
25
25
  type="button"
26
26
  >
27
- <svg
28
- class="lucide lucide-upload memori--upload-icon"
29
- fill="none"
30
- height="24"
31
- stroke="currentColor"
32
- stroke-linecap="round"
33
- stroke-linejoin="round"
34
- stroke-width="2"
35
- viewBox="0 0 24 24"
36
- width="24"
37
- xmlns="http://www.w3.org/2000/svg"
27
+ <span
28
+ class="memori-button__content"
38
29
  >
39
- <path
40
- d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"
41
- />
42
- <polyline
43
- points="17 8 12 3 7 8"
44
- />
45
- <line
46
- x1="12"
47
- x2="12"
48
- y1="3"
49
- y2="15"
50
- />
51
- </svg>
30
+ <svg
31
+ class="lucide lucide-upload memori--upload-icon"
32
+ fill="none"
33
+ height="24"
34
+ stroke="currentColor"
35
+ stroke-linecap="round"
36
+ stroke-linejoin="round"
37
+ stroke-width="2"
38
+ viewBox="0 0 24 24"
39
+ width="24"
40
+ xmlns="http://www.w3.org/2000/svg"
41
+ >
42
+ <path
43
+ d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"
44
+ />
45
+ <polyline
46
+ points="17 8 12 3 7 8"
47
+ />
48
+ <line
49
+ x1="12"
50
+ x2="12"
51
+ y1="3"
52
+ y2="15"
53
+ />
54
+ </svg>
55
+ </span>
52
56
  </button>
53
57
  </span>
54
58
  </span>
@@ -1,9 +1,9 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
- import { Button, Spin } from '@memori.ai/ui';
1
+ import React, { useEffect, useMemo, useState } from 'react';
2
+ import { Spin } from '@memori.ai/ui';
3
+ import IconButton from '../IconButton/IconButton';
3
4
  import ArtifactDrawer from '../MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer';
4
5
  import { useTranslation } from 'react-i18next';
5
6
  import {
6
- Expand,
7
7
  MapPin,
8
8
  Share2,
9
9
  EllipsisVertical,
@@ -21,17 +21,6 @@ import {
21
21
  pasteAsCardCharThreshold,
22
22
  } from '../../helpers/constants';
23
23
 
24
- function isFullscreenAllowedOnDevice(): boolean {
25
- if (typeof document === 'undefined') return false;
26
-
27
- if (document.fullscreenEnabled === true) return true;
28
-
29
- const fullscreenMeta = document.querySelector(
30
- 'meta[name="memori-fullscreen-enabled"], meta[name="fullscreen-enabled"]'
31
- );
32
- return fullscreenMeta?.getAttribute('content') === 'true';
33
- }
34
-
35
24
  const ChatLayout: React.FC<LayoutProps> = ({
36
25
  Header,
37
26
  headerProps,
@@ -67,7 +56,9 @@ const ChatLayout: React.FC<LayoutProps> = ({
67
56
  const tenant = headerProps?.tenant;
68
57
  const baseUrl = headerProps?.baseUrl;
69
58
  const loggedUser =
70
- headerProps?.loginToken && headerProps?.user ? headerProps.user : undefined;
59
+ headerProps?.loginToken && headerProps?.user?.userID
60
+ ? headerProps.user
61
+ : undefined;
71
62
  const enrichedUser = loggedUser as
72
63
  | (typeof loggedUser & {
73
64
  name?: string;
@@ -86,16 +77,6 @@ const ChatLayout: React.FC<LayoutProps> = ({
86
77
  const loggedUserInitial = loggedUserDisplayName.charAt(0).toUpperCase();
87
78
  const isSessionStarted = Boolean(sessionId && hasUserActivatedSpeak);
88
79
 
89
- const handleMobileFullscreen = useCallback(() => {
90
- if (!isFullscreenAllowedOnDevice()) return;
91
-
92
- if (!document.fullscreenElement) {
93
- document.documentElement.requestFullscreen().catch(() => {});
94
- return;
95
- }
96
- document.exitFullscreen().catch(() => {});
97
- }, []);
98
-
99
80
  const handleMobileLogout = () => {
100
81
  if (!headerProps) return;
101
82
  if (loggedUser && headerProps.onLogout) {
@@ -166,6 +147,8 @@ const ChatLayout: React.FC<LayoutProps> = ({
166
147
  isMobile &&
167
148
  !!headerProps.loginToken &&
168
149
  headerProps.showChatHistory !== false;
150
+ const showShareInPanel = headerProps.showShare !== false;
151
+ const showLocationInPanel = !!headerProps.memori?.needsPosition;
169
152
 
170
153
  const historyBlock = showChatHistoryInPanel
171
154
  ? [
@@ -186,41 +169,42 @@ const ChatLayout: React.FC<LayoutProps> = ({
186
169
 
187
170
  return [
188
171
  ...historyBlock,
189
- {
190
- key: 'fullscreen',
191
- icon: <Expand size={18} />,
192
- title: t('fullscreenEnter') || 'Full screen',
193
- subtitle: t('widget.expandToImmersive') || 'Expand to immersive view',
194
- onClick: () => {
195
- handleMobileFullscreen();
196
- setMobileSheetOpen(false);
197
- },
198
- },
199
- {
200
- key: 'share',
201
- icon: <Share2 size={18} />,
202
- title: t('widget.share') || 'Share chat',
203
- subtitle:
204
- t('widget.mobileSession.copyLinkOrDownload') ||
205
- 'Copy link or download',
206
- view: 'share' as const,
207
- },
208
- {
209
- key: 'location',
210
- icon: <MapPin size={18} />,
211
- title:
212
- t('widget.mobileSession.locationTracking') || 'Location tracking',
213
- subtitle:
214
- headerProps.position?.placeName ||
215
- t('widget.mobileSession.currentlyOff') ||
216
- 'Currently off',
217
- view: 'location' as const,
218
- trailing: (
219
- <span className="memori-mobile-session-panel--chevron">{'>'}</span>
220
- ),
221
- },
172
+ ...(showShareInPanel
173
+ ? [
174
+ {
175
+ key: 'share',
176
+ icon: <Share2 size={18} />,
177
+ title: t('widget.share') || 'Share chat',
178
+ subtitle:
179
+ t('widget.mobileSession.copyLinkOrDownload') ||
180
+ 'Copy link or download',
181
+ view: 'share' as const,
182
+ },
183
+ ]
184
+ : []),
185
+ ...(showLocationInPanel
186
+ ? [
187
+ {
188
+ key: 'location',
189
+ icon: <MapPin size={18} />,
190
+ title:
191
+ t('widget.mobileSession.locationTracking') ||
192
+ 'Location tracking',
193
+ subtitle:
194
+ headerProps.position?.placeName ||
195
+ t('widget.mobileSession.currentlyOff') ||
196
+ 'Currently off',
197
+ view: 'location' as const,
198
+ trailing: (
199
+ <span className="memori-mobile-session-panel--chevron">
200
+ {'>'}
201
+ </span>
202
+ ),
203
+ },
204
+ ]
205
+ : []),
222
206
  ];
223
- }, [headerProps, isMobile, isSessionStarted, t, handleMobileFullscreen]);
207
+ }, [headerProps, isMobile, t]);
224
208
 
225
209
  return (
226
210
  <>
@@ -230,6 +214,118 @@ const ChatLayout: React.FC<LayoutProps> = ({
230
214
  <Spin spinning={loading} className="memori-chat-layout">
231
215
  <div id="extension" />
232
216
 
217
+ {/* Header stays full-width above the content split — same pattern as FULLPAGE */}
218
+ <div className="memori-chat-layout--header">
219
+ {Header && headerProps && mobileHeaderProps && (
220
+ <div className="memori-fullpage-header-row">
221
+ <Header
222
+ {...mobileHeaderProps}
223
+ buttonVariant="outline"
224
+ extraActions={
225
+ isMobile ? (
226
+ <IconButton
227
+ className="memori-chat-layout--overflow-trigger"
228
+ active={mobileSheetOpen}
229
+ aria-label={t('widget.moreActions') || 'More actions'}
230
+ icon={<EllipsisVertical />}
231
+ onClick={() =>
232
+ setMobileSheetOpen(currentOpen => !currentOpen)
233
+ }
234
+ />
235
+ ) : undefined
236
+ }
237
+ />
238
+ </div>
239
+ )}
240
+ </div>
241
+
242
+ {headerProps && (
243
+ <MobileSessionPanel
244
+ open={mobileSheetOpen}
245
+ presentation="popover"
246
+ onClose={() => setMobileSheetOpen(false)}
247
+ title={t('widget.mobileSession.session') || 'Session'}
248
+ loginToken={headerProps.loginToken}
249
+ user={headerProps.user}
250
+ apiClient={headerProps.apiClient}
251
+ userName={loggedUserDisplayName}
252
+ userEmail={loggedUser?.eMail}
253
+ userInitial={loggedUserInitial}
254
+ avatarURL={loggedUser?.avatarURL}
255
+ birthDate={loggedUser?.birthDate}
256
+ actions={mobileSessionActions}
257
+ knownFactsPageTitle={t('knownFacts.title') || 'Known facts'}
258
+ sharePageTitle={t('widget.share') || 'Share'}
259
+ locationPageTitle={
260
+ t('widget.mobileSession.locationTracking') || 'Location tracking'
261
+ }
262
+ backLabel={t('back') || 'Back'}
263
+ locationStatusLabel={
264
+ t('widget.mobileSession.locationStatus') || 'Status'
265
+ }
266
+ locationPlace={headerProps.position?.placeName}
267
+ locationUnknownLabel={
268
+ t('write_and_speak.unknownPosition') || 'Unknown position'
269
+ }
270
+ locationEnableLabel={t('widget.shareLocation') || 'Share location'}
271
+ locationDisableLabel={
272
+ t('widget.mobileSession.disableLocationSharing') ||
273
+ 'Disable location sharing'
274
+ }
275
+ knownFactsDescription={
276
+ t('knownFacts.description', {
277
+ memoriName: memori?.name || '',
278
+ }) || ''
279
+ }
280
+ knownFactsCtaLabel={
281
+ t('widget.mobileSession.openKnownFacts') ||
282
+ 'Open full known facts'
283
+ }
284
+ knownFactsCountLabel={
285
+ (t('widget.mobileSession.knownFactsMessages', {
286
+ count: headerProps.history?.length || 0,
287
+ }) as string) || ''
288
+ }
289
+ shareContent={
290
+ <ShareButton
291
+ tenant={headerProps?.tenant}
292
+ memori={headerProps?.memori}
293
+ sessionID={headerProps?.sessionID}
294
+ title={headerProps?.memori?.name}
295
+ baseUrl={headerProps?.baseUrl}
296
+ align="left"
297
+ history={headerProps?.history}
298
+ renderMode="inline"
299
+ />
300
+ }
301
+ knownFactsDisabled={!isSessionStarted}
302
+ showSessionInfo={isSessionStarted}
303
+ history={headerProps.history ?? []}
304
+ isLoggedIn={!!loggedUser}
305
+ showLogin={!!headerProps.showLogin}
306
+ loginLabel={t('login.login') || 'Log in'}
307
+ onLogin={() => {
308
+ headerProps.setShowLoginDrawer(true);
309
+ setMobileSheetOpen(false);
310
+ }}
311
+ onKnownFactsOpen={() => {
312
+ if (!isSessionStarted) return;
313
+ headerProps.setShowKnownFactsDrawer(true);
314
+ setMobileSheetOpen(false);
315
+ }}
316
+ onLocationEnable={handleEnableLocation}
317
+ onLocationDisable={handleDisableLocation}
318
+ venue={headerProps.position}
319
+ setVenue={headerProps.setVenue}
320
+ logoutLabel={t('login.logout') || 'Log out'}
321
+ onLogout={() => {
322
+ handleMobileLogout();
323
+ setMobileSheetOpen(false);
324
+ }}
325
+ />
326
+ )}
327
+
328
+ {/* Content row: chat + artifact as full-height siblings (FULLPAGE pattern) */}
233
329
  <div
234
330
  className={`memori-chat-layout--main${
235
331
  globalBackground ? ' memori-chat-layout--main--has-background' : ''
@@ -242,7 +338,6 @@ const ChatLayout: React.FC<LayoutProps> = ({
242
338
  : undefined
243
339
  }
244
340
  >
245
- {/* Chat column — flex:1, shrinks when artifact column grows */}
246
341
  <div
247
342
  className={
248
343
  state.isFullscreen
@@ -250,189 +345,72 @@ const ChatLayout: React.FC<LayoutProps> = ({
250
345
  : `memori-chat-layout--controls`
251
346
  }
252
347
  >
253
- <div className="memori-chat-layout--header">
254
- {Header && headerProps && mobileHeaderProps && (
255
- <div className="memori-fullpage-header-row">
256
- <Header
257
- {...mobileHeaderProps}
258
- buttonVariant="outline"
259
- extraActions={
260
- isMobile ? (
261
- <Button
262
- variant="outline"
263
- className={`memori-chat-layout--overflow-trigger ${
264
- mobileSheetOpen ? 'memori-button--active' : ''
265
- }`}
266
- aria-label={
267
- t('widget.moreActions') || 'More actions'
268
- }
269
- icon={<EllipsisVertical />}
270
- onClick={() =>
271
- setMobileSheetOpen(currentOpen => !currentOpen)
272
- }
273
- />
274
- ) : undefined
275
- }
276
- />
277
- </div>
278
- )}
279
- </div>
280
-
281
- {headerProps && (
282
- <MobileSessionPanel
283
- open={mobileSheetOpen}
284
- presentation="popover"
285
- onClose={() => setMobileSheetOpen(false)}
286
- title={t('widget.mobileSession.session') || 'Session'}
287
- loginToken={headerProps.loginToken}
288
- user={headerProps.user}
289
- apiClient={headerProps.apiClient}
290
- userName={loggedUserDisplayName}
291
- userEmail={loggedUser?.eMail}
292
- userInitial={loggedUserInitial}
293
- avatarURL={loggedUser?.avatarURL}
294
- birthDate={loggedUser?.birthDate}
295
- actions={mobileSessionActions}
296
- knownFactsPageTitle={t('knownFacts.title') || 'Known facts'}
297
- sharePageTitle={t('widget.share') || 'Share'}
298
- locationPageTitle={
299
- t('widget.mobileSession.locationTracking') ||
300
- 'Location tracking'
301
- }
302
- backLabel={t('back') || 'Back'}
303
- locationStatusLabel={
304
- t('widget.mobileSession.locationStatus') || 'Status'
305
- }
306
- locationPlace={headerProps.position?.placeName}
307
- locationUnknownLabel={
308
- t('write_and_speak.unknownPosition') || 'Unknown position'
309
- }
310
- locationEnableLabel={
311
- t('widget.shareLocation') || 'Share location'
312
- }
313
- locationDisableLabel={
314
- t('widget.mobileSession.disableLocationSharing') ||
315
- 'Disable location sharing'
316
- }
317
- knownFactsDescription={
318
- t('knownFacts.description', {
319
- memoriName: memori?.name || '',
320
- }) || ''
321
- }
322
- knownFactsCtaLabel={
323
- t('widget.mobileSession.openKnownFacts') ||
324
- 'Open full known facts'
325
- }
326
- knownFactsCountLabel={
327
- (t('widget.mobileSession.knownFactsMessages', {
328
- count: headerProps.history?.length || 0,
329
- }) as string) || ''
330
- }
331
- shareContent={
332
- <ShareButton
333
- tenant={headerProps?.tenant}
334
- memori={headerProps?.memori}
335
- sessionID={headerProps?.sessionID}
336
- title={headerProps?.memori?.name}
337
- baseUrl={headerProps?.baseUrl}
338
- align="left"
339
- history={headerProps?.history}
340
- renderMode="inline"
341
- />
342
- }
343
- knownFactsDisabled={!isSessionStarted}
344
- showSessionInfo={isSessionStarted}
345
- history={headerProps.history ?? []}
346
- isLoggedIn={!!loggedUser}
347
- loginLabel={t('login.login') || 'Log in'}
348
- onLogin={() => {
349
- headerProps.setShowLoginDrawer(true);
350
- setMobileSheetOpen(false);
351
- }}
352
- onKnownFactsOpen={() => {
353
- if (!isSessionStarted) return;
354
- headerProps.setShowKnownFactsDrawer(true);
355
- setMobileSheetOpen(false);
356
- }}
357
- onLocationEnable={handleEnableLocation}
358
- onLocationDisable={handleDisableLocation}
359
- venue={headerProps.position}
360
- setVenue={headerProps.setVenue}
361
- logoutLabel={t('login.logout') || 'Log out'}
362
- onLogout={() => {
363
- handleMobileLogout();
364
- setMobileSheetOpen(false);
365
- }}
366
- />
367
- )}
368
348
  <div className="memori-conversation-column">
369
- <div className="memori-chat-layout--body">
370
- {sessionId && hasUserActivatedSpeak && Chat && chatProps ? (
371
- <Chat {...chatProps} showInputs={false} />
372
- ) : startPanelProps ? (
373
- <div
374
- className="memori-chat-layout--start-shell"
375
- id="chat-wrapper"
376
- >
377
- <div className="memori-chat-layout--start-panel-wrap">
378
- <StartPanel {...startPanelProps} />
349
+ <div className="memori-chat-layout--body">
350
+ {sessionId && hasUserActivatedSpeak && Chat && chatProps ? (
351
+ <Chat {...chatProps} showInputs={false} />
352
+ ) : startPanelProps ? (
353
+ <div
354
+ className="memori-chat-layout--start-shell"
355
+ id="chat-wrapper"
356
+ >
357
+ <div className="memori-chat-layout--start-panel-wrap">
358
+ <StartPanel {...startPanelProps} />
359
+ </div>
379
360
  </div>
380
- </div>
381
- ) : null}
382
- </div>
361
+ ) : null}
362
+ </div>
383
363
 
384
- {/* Input bar sits outside body so it spans the shared column below the scroll area */}
385
- {Chat && chatProps && chatProps.showInputs !== false && (
386
- <ChatInputs
387
- userMessage={chatProps.userMessage}
388
- onChangeUserMessage={chatProps.onChangeUserMessage}
389
- dialogState={chatProps.dialogState}
390
- instruct={chatProps.instruct}
391
- authToken={chatProps.authToken}
392
- sendMessage={chatProps.sendMessage}
393
- isTyping={chatProps.memoriTyping}
394
- microphoneMode={chatProps.microphoneMode}
395
- sendOnEnter={chatProps.sendOnEnter}
396
- setSendOnEnter={chatProps.setSendOnEnter}
397
- client={chatProps.client}
398
- sessionID={chatProps.sessionID}
399
- showUpload={chatProps.showUpload}
400
- attachmentsMenuOpen={chatProps.attachmentsMenuOpen}
401
- setAttachmentsMenuOpen={chatProps.setAttachmentsMenuOpen}
402
- onTextareaFocus={() => {
403
- chatProps.stopListening?.();
404
- }}
405
- onTextareaBlur={() => {}}
406
- onTextareaExpanded={() => {}}
407
- startListening={chatProps.startListening}
408
- stopListening={chatProps.stopListening}
409
- stopAudio={chatProps.stopAudio}
410
- listening={chatProps.listening}
411
- isPlayingAudio={chatProps.isPlayingAudio}
412
- showMicrophone={chatProps.showMicrophone}
413
- memoriID={chatProps.memori?.memoriID}
414
- maxTextareaCharacters={chatProps.maxTextareaCharacters}
415
- maxTotalMessagePayload={chatProps.maxTotalMessagePayload}
416
- maxDocumentsPerMessage={maxDocumentsPerMessage}
417
- maxDocumentContentLength={maxDocumentContentLength}
418
- pasteAsCardLineThreshold={pasteAsCardLineThreshold}
419
- pasteAsCardCharThreshold={pasteAsCardCharThreshold}
420
- showAiGeneratedNote={isSessionStarted}
421
- footerBrand={poweredBy}
422
- />
423
- )}
364
+ {/* Input bar sits outside body so it spans the shared column below the scroll area */}
365
+ {Chat && chatProps && chatProps.showInputs !== false && (
366
+ <ChatInputs
367
+ userMessage={chatProps.userMessage}
368
+ onChangeUserMessage={chatProps.onChangeUserMessage}
369
+ dialogState={chatProps.dialogState}
370
+ instruct={chatProps.instruct}
371
+ authToken={chatProps.authToken}
372
+ sendMessage={chatProps.sendMessage}
373
+ isTyping={chatProps.memoriTyping}
374
+ microphoneMode={chatProps.microphoneMode}
375
+ sendOnEnter={chatProps.sendOnEnter}
376
+ setSendOnEnter={chatProps.setSendOnEnter}
377
+ client={chatProps.client}
378
+ sessionID={chatProps.sessionID}
379
+ showUpload={chatProps.showUpload}
380
+ attachmentsMenuOpen={chatProps.attachmentsMenuOpen}
381
+ setAttachmentsMenuOpen={chatProps.setAttachmentsMenuOpen}
382
+ onTextareaFocus={() => {
383
+ chatProps.stopListening?.();
384
+ }}
385
+ onTextareaBlur={() => {}}
386
+ onTextareaExpanded={() => {}}
387
+ startListening={chatProps.startListening}
388
+ stopListening={chatProps.stopListening}
389
+ stopAudio={chatProps.stopAudio}
390
+ listening={chatProps.listening}
391
+ isPlayingAudio={chatProps.isPlayingAudio}
392
+ showMicrophone={chatProps.showMicrophone}
393
+ memoriID={chatProps.memori?.memoriID}
394
+ maxTextareaCharacters={chatProps.maxTextareaCharacters}
395
+ maxTotalMessagePayload={chatProps.maxTotalMessagePayload}
396
+ maxDocumentsPerMessage={maxDocumentsPerMessage}
397
+ maxDocumentContentLength={maxDocumentContentLength}
398
+ pasteAsCardLineThreshold={pasteAsCardLineThreshold}
399
+ pasteAsCardCharThreshold={pasteAsCardCharThreshold}
400
+ showAiGeneratedNote={isSessionStarted}
401
+ footerBrand={poweredBy}
402
+ />
403
+ )}
424
404
  </div>
425
405
  </div>
426
406
 
427
- {/* Artifact column — width 0→480px with CSS transition */}
407
+ {/* Artifact column — shrinks chat column only; outer layout stays put */}
428
408
  <div
429
409
  className={`memori--grid-column-artifact${
430
410
  useSideArtifactChrome ? ' memori--grid-column-artifact--open' : ''
431
411
  }`}
432
412
  >
433
- {useSideArtifactChrome && (
434
- <ArtifactDrawer isLayoutColumn />
435
- )}
413
+ {useSideArtifactChrome && <ArtifactDrawer isLayoutColumn />}
436
414
  </div>
437
415
  </div>
438
416
  </Spin>