@memori.ai/memori-react 9.0.0-alpha.21 → 9.0.0-alpha.22

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 (250) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.css +1 -7
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +1 -1
  4. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  5. package/dist/components/Auth/Auth.css +12 -5
  6. package/dist/components/Auth/Auth.d.ts +1 -1
  7. package/dist/components/Auth/Auth.js +46 -32
  8. package/dist/components/Auth/Auth.js.map +1 -1
  9. package/dist/components/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  10. package/dist/components/Chat/Chat.css +1 -0
  11. package/dist/components/Chat/Chat.js +1 -1
  12. package/dist/components/Chat/Chat.js.map +1 -1
  13. package/dist/components/ChatBubble/ChatBubble.css +32 -5
  14. package/dist/components/ChatBubble/ChatBubble.js +2 -4
  15. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  16. package/dist/components/ChatHistoryDrawer/ChatHistory.d.ts +3 -1
  17. package/dist/components/ChatHistoryDrawer/ChatHistory.js +2 -2
  18. package/dist/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  19. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  20. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.d.ts +3 -1
  21. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.js +7 -57
  22. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  23. package/dist/components/ChatInputs/ChatInputs.js +10 -1
  24. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  25. package/dist/components/ChatTextArea/ChatTextArea.css +1 -1
  26. package/dist/components/ContentPreviewModal/ContentPreviewModal.css +1 -10
  27. package/dist/components/ContentPreviewModal/ContentPreviewModal.js +1 -1
  28. package/dist/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  29. package/dist/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  30. package/dist/components/Header/Header.css +8 -3
  31. package/dist/components/Header/Header.js +15 -18
  32. package/dist/components/Header/Header.js.map +1 -1
  33. package/dist/components/IconButton/IconButton.d.ts +1 -1
  34. package/dist/components/KnownFacts/KnownFacts.css +1 -1
  35. package/dist/components/KnownFacts/KnownFacts.js +2 -5
  36. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  37. package/dist/components/LoginDrawer/LoginDrawer.css +16 -14
  38. package/dist/components/LoginDrawer/LoginDrawer.js +19 -11
  39. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  40. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +4 -4
  41. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +28 -5
  42. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -2
  43. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  44. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +1 -1
  45. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  46. package/dist/components/MemoriWidget/MemoriWidget.js +35 -31
  47. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  48. package/dist/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  49. package/dist/components/PositionPopover/PositionPopover.css +3 -3
  50. package/dist/components/PositionPopover/PositionPopover.js +38 -25
  51. package/dist/components/PositionPopover/PositionPopover.js.map +1 -1
  52. package/dist/components/Snippet/Snippet.css +1 -1
  53. package/dist/components/StartPanel/StartPanel.css +19 -3
  54. package/dist/components/StartPanel/StartPanel.js +12 -18
  55. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  56. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  57. package/dist/components/layouts/totem.css +43 -9
  58. package/dist/helpers/positionPopover.d.ts +2 -1
  59. package/dist/helpers/positionPopover.js +10 -2
  60. package/dist/helpers/positionPopover.js.map +1 -1
  61. package/dist/icons/MemoriIcon.js +1 -1
  62. package/dist/icons/MemoriIcon.js.map +1 -1
  63. package/dist/locales/de.json +4 -1
  64. package/dist/locales/en.json +3 -1
  65. package/dist/locales/es.json +3 -1
  66. package/dist/locales/fr.json +3 -1
  67. package/dist/locales/it.json +3 -1
  68. package/dist/styles.css +1 -1
  69. package/dist/version.d.ts +1 -1
  70. package/dist/version.js +1 -1
  71. package/esm/components/AgeVerificationModal/AgeVerificationModal.css +1 -7
  72. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +1 -1
  73. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  74. package/esm/components/Auth/Auth.css +12 -5
  75. package/esm/components/Auth/Auth.d.ts +1 -1
  76. package/esm/components/Auth/Auth.js +47 -33
  77. package/esm/components/Auth/Auth.js.map +1 -1
  78. package/esm/components/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  79. package/esm/components/Chat/Chat.css +1 -0
  80. package/esm/components/Chat/Chat.js +1 -1
  81. package/esm/components/Chat/Chat.js.map +1 -1
  82. package/esm/components/ChatBubble/ChatBubble.css +32 -5
  83. package/esm/components/ChatBubble/ChatBubble.js +2 -4
  84. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  85. package/esm/components/ChatHistoryDrawer/ChatHistory.d.ts +3 -1
  86. package/esm/components/ChatHistoryDrawer/ChatHistory.js +2 -2
  87. package/esm/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  88. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  89. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.d.ts +3 -1
  90. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js +9 -59
  91. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  92. package/esm/components/ChatInputs/ChatInputs.js +11 -2
  93. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  94. package/esm/components/ChatTextArea/ChatTextArea.css +1 -1
  95. package/esm/components/ContentPreviewModal/ContentPreviewModal.css +1 -10
  96. package/esm/components/ContentPreviewModal/ContentPreviewModal.js +1 -1
  97. package/esm/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  98. package/esm/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  99. package/esm/components/Header/Header.css +8 -3
  100. package/esm/components/Header/Header.js +15 -18
  101. package/esm/components/Header/Header.js.map +1 -1
  102. package/esm/components/IconButton/IconButton.d.ts +1 -1
  103. package/esm/components/KnownFacts/KnownFacts.css +1 -1
  104. package/esm/components/KnownFacts/KnownFacts.js +2 -5
  105. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  106. package/esm/components/LoginDrawer/LoginDrawer.css +16 -14
  107. package/esm/components/LoginDrawer/LoginDrawer.js +20 -12
  108. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  109. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +4 -4
  110. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +28 -5
  111. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -2
  112. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  113. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +1 -1
  114. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  115. package/esm/components/MemoriWidget/MemoriWidget.js +36 -32
  116. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  117. package/esm/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  118. package/esm/components/PositionPopover/PositionPopover.css +3 -3
  119. package/esm/components/PositionPopover/PositionPopover.js +39 -26
  120. package/esm/components/PositionPopover/PositionPopover.js.map +1 -1
  121. package/esm/components/Snippet/Snippet.css +1 -1
  122. package/esm/components/StartPanel/StartPanel.css +19 -3
  123. package/esm/components/StartPanel/StartPanel.js +12 -18
  124. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  125. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  126. package/esm/components/layouts/totem.css +43 -9
  127. package/esm/helpers/positionPopover.d.ts +2 -1
  128. package/esm/helpers/positionPopover.js +9 -2
  129. package/esm/helpers/positionPopover.js.map +1 -1
  130. package/esm/icons/MemoriIcon.js +1 -1
  131. package/esm/icons/MemoriIcon.js.map +1 -1
  132. package/esm/locales/de.json +4 -1
  133. package/esm/locales/en.json +3 -1
  134. package/esm/locales/es.json +3 -1
  135. package/esm/locales/fr.json +3 -1
  136. package/esm/locales/it.json +3 -1
  137. package/esm/styles.css +1 -1
  138. package/esm/version.d.ts +1 -1
  139. package/esm/version.js +1 -1
  140. package/package.json +5 -3
  141. package/src/Live/Agents.stories.tsx +49 -0
  142. package/src/Live/KnownFacts.stories.tsx +50 -0
  143. package/src/Showcase.stories.tsx +3 -14
  144. package/src/components/AgeVerificationModal/AgeVerificationModal.css +1 -7
  145. package/src/components/AgeVerificationModal/AgeVerificationModal.stories.tsx +1 -1
  146. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +1 -0
  147. package/src/components/Auth/Auth.css +12 -5
  148. package/src/components/Auth/Auth.stories.tsx +1 -1
  149. package/src/components/Auth/Auth.test.tsx +68 -1
  150. package/src/components/Auth/Auth.tsx +69 -54
  151. package/src/components/Auth/__snapshots__/Auth.test.tsx.snap +5 -6
  152. package/src/components/Avatar/Avatar.stories.tsx +1 -18
  153. package/src/components/Avatar/AvatarView/AvatarView.stories.tsx +1 -103
  154. package/src/components/Blob/Blob.stories.tsx +1 -1
  155. package/src/components/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  156. package/src/components/BlockedMemoriBadge/BlockedMemoriBadge.stories.tsx +1 -1
  157. package/src/components/ChangeMode/ChangeMode.stories.tsx +1 -1
  158. package/src/components/Chat/Chat.css +1 -0
  159. package/src/components/Chat/Chat.stories.tsx +61 -7
  160. package/src/components/Chat/Chat.tsx +1 -0
  161. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +80 -80
  162. package/src/components/ChatBubble/ChatBubble.css +32 -5
  163. package/src/components/ChatBubble/ChatBubble.stories.tsx +13 -2
  164. package/src/components/ChatBubble/ChatBubble.test.tsx +21 -1
  165. package/src/components/ChatBubble/ChatBubble.tsx +7 -13
  166. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +158 -185
  167. package/src/components/ChatHistoryDrawer/ChatHistory.stories.tsx +1 -1
  168. package/src/components/ChatHistoryDrawer/ChatHistory.tsx +6 -0
  169. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  170. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.tsx +24 -81
  171. package/src/components/ChatInputs/ChatInputs.stories.tsx +1 -39
  172. package/src/components/ChatInputs/ChatInputs.test.tsx +47 -0
  173. package/src/components/ChatInputs/ChatInputs.tsx +12 -2
  174. package/src/components/ChatTextArea/ChatTextArea.css +1 -1
  175. package/src/components/CompletionProviderStatus/CompletionProviderStatus.stories.tsx +1 -1
  176. package/src/components/ContentPreviewModal/ContentPreviewModal.css +1 -10
  177. package/src/components/ContentPreviewModal/ContentPreviewModal.tsx +1 -1
  178. package/src/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  179. package/src/components/ExpertsDrawer/ExpertsDrawer.stories.tsx +1 -1
  180. package/src/components/FeedbackButtons/FeedbackButtons.stories.tsx +29 -10
  181. package/src/components/Header/Header.css +8 -3
  182. package/src/components/Header/Header.stories.tsx +1 -1
  183. package/src/components/Header/Header.tsx +146 -117
  184. package/src/components/KnownFacts/KnownFacts.css +1 -1
  185. package/src/components/KnownFacts/KnownFacts.stories.tsx +1 -23
  186. package/src/components/KnownFacts/KnownFacts.tsx +4 -9
  187. package/src/components/LoginDrawer/LoginDrawer.css +16 -14
  188. package/src/components/LoginDrawer/LoginDrawer.stories.tsx +2 -52
  189. package/src/components/LoginDrawer/LoginDrawer.tsx +51 -39
  190. package/src/components/MediaWidget/MediaItemWidget.stories.tsx +1 -15
  191. package/src/components/MediaWidget/MediaWidget.stories.tsx +1 -45
  192. package/src/components/MemoriArtifactSystem/components/ArtifactActions/CopyButton.stories.tsx +1 -1
  193. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +4 -4
  194. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +28 -5
  195. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +4 -6
  196. package/src/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.tsx +1 -1
  197. package/src/components/MemoriArtifactSystem/utils/ArtifactAPI.test.tsx +32 -28
  198. package/src/components/MemoriWidget/MemoriUIProvider.contract.test.tsx +55 -0
  199. package/src/components/MemoriWidget/MemoriWidget.stories.tsx +55 -77
  200. package/src/components/MemoriWidget/MemoriWidget.tsx +49 -44
  201. package/src/components/MemoriWidget/getChatStyles.test.ts +24 -0
  202. package/src/components/MicrophoneButton/MicrophoneButton.stories.tsx +1 -1
  203. package/src/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  204. package/src/components/PositionPopover/PositionPopover.css +3 -3
  205. package/src/components/PositionPopover/PositionPopover.stories.tsx +1 -1
  206. package/src/components/PositionPopover/PositionPopover.tsx +50 -28
  207. package/src/components/PoweredBy/PoweredBy.stories.tsx +1 -54
  208. package/src/components/PoweredBy/__snapshots__/PoweredBy.test.tsx.snap +2 -2
  209. package/src/components/SendOnEnterMenu/SendOnEnterMenu.stories.tsx +1 -1
  210. package/src/components/SettingsDrawer/SettingsDrawer.stories.tsx +1 -1
  211. package/src/components/ShareButton/ShareButton.stories.tsx +1 -1
  212. package/src/components/Snippet/Snippet.css +1 -1
  213. package/src/components/Snippet/Snippet.stories.tsx +1 -1
  214. package/src/components/StartPanel/StartPanel.css +19 -3
  215. package/src/components/StartPanel/StartPanel.stories.tsx +2 -2
  216. package/src/components/StartPanel/StartPanel.tsx +22 -35
  217. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +177 -121
  218. package/src/components/Typing/Typing.stories.tsx +1 -1
  219. package/src/components/WhyThisAnswer/WhyThisAnswer.stories.tsx +22 -44
  220. package/src/components/layouts/FullBody/FullBody.stories.tsx +55 -68
  221. package/src/components/layouts/Totem/Totem.stories.tsx +69 -87
  222. package/src/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  223. package/src/components/layouts/ZoomedFullBody/ZoomedFullBody.stories.tsx +69 -87
  224. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +19 -41
  225. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +39 -83
  226. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +15 -11
  227. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +116 -42
  228. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +18 -40
  229. package/src/components/layouts/layouts.stories.tsx +96 -179
  230. package/src/components/layouts/totem.css +43 -9
  231. package/src/helpers/positionPopover.test.ts +36 -1
  232. package/src/helpers/positionPopover.ts +21 -4
  233. package/src/i18n.knownFacts.test.ts +40 -0
  234. package/src/icons/MemoriIcon.tsx +1 -1
  235. package/src/index.stories.tsx +1 -47
  236. package/src/locales/de.json +4 -1
  237. package/src/locales/en.json +3 -1
  238. package/src/locales/es.json +3 -1
  239. package/src/locales/fr.json +3 -1
  240. package/src/locales/it.json +3 -1
  241. package/src/styles.css +13 -27
  242. package/src/version.ts +1 -1
  243. package/src/components/ChatTextArea/ChatTextArea.stories.tsx +0 -55
  244. package/src/components/CustomGLBModelViewer/ModelViewer.stories.tsx +0 -58
  245. package/src/components/DateSelector/DateSelector.stories.tsx +0 -47
  246. package/src/components/FilePreview/FilePreview.stories.tsx +0 -63
  247. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +0 -265
  248. package/src/components/UploadButton/UploadButton.stories.tsx +0 -510
  249. package/src/components/VenueWidget/VenueWidget.stories.tsx +0 -69
  250. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.stories.tsx +0 -115
@@ -41,6 +41,8 @@ export interface Props {
41
41
  language: string;
42
42
  userLang: string;
43
43
  isMultilanguageEnabled?: boolean;
44
+ showFunctionCache?: boolean;
45
+ showMessageConsumption?: boolean;
44
46
  }
45
47
 
46
48
  const ITEMS_PER_PAGE = 8;
@@ -453,6 +455,8 @@ const ChatHistoryDrawer = ({
453
455
  language,
454
456
  userLang,
455
457
  isMultilanguageEnabled = false,
458
+ showFunctionCache = false,
459
+ showMessageConsumption = false,
456
460
  }: Props) => {
457
461
  const surfaceEl = useWidgetSurfaceEl();
458
462
  const { t } = useTranslation();
@@ -1187,6 +1191,8 @@ const ChatHistoryDrawer = ({
1187
1191
  onBack={handleCloseResumeDrawer}
1188
1192
  onClose={handleCloseResumeDrawer}
1189
1193
  onExportChat={handleExportSelectedChat}
1194
+ showFunctionCache={showFunctionCache}
1195
+ showMessageConsumption={showMessageConsumption}
1190
1196
  />
1191
1197
  </div>
1192
1198
  ) : (
@@ -1,5 +1,5 @@
1
1
  .memori-chat-resume-drawer {
2
- position: fixed;
2
+ position: absolute;
3
3
  z-index: 1200;
4
4
  inset: 0;
5
5
  pointer-events: none;
@@ -1,5 +1,5 @@
1
- import React, { useEffect, useMemo, useRef, useState } from 'react';
2
- import { Button } from '@memori.ai/ui';
1
+ import React, { useEffect, useMemo, useRef } from 'react';
2
+ import { Button, Drawer } from '@memori.ai/ui';
3
3
  import {
4
4
  Message,
5
5
  Memori,
@@ -7,6 +7,7 @@ import {
7
7
  import { ArrowLeft, ArrowUpRight, Download } from 'lucide-react';
8
8
  import { useTranslation } from 'react-i18next';
9
9
  import { stripHTML } from '../../helpers/utils';
10
+ import { useWidgetSurfaceEl } from '../../context/widgetSurfaceContext';
10
11
  import Chat from '../Chat/Chat';
11
12
 
12
13
  export interface ResumeDrawerMessage {
@@ -29,6 +30,10 @@ export interface ChatResumeDrawerProps {
29
30
  onClose: () => void;
30
31
  onBack?: () => void;
31
32
  onExportChat: () => void;
33
+ /**
34
+ * When true, render panel content only (nested inside ChatHistory Drawer).
35
+ * When false, open as a library Drawer on the widget surface.
36
+ */
32
37
  embedded?: boolean;
33
38
  session: {
34
39
  title: string;
@@ -39,9 +44,10 @@ export interface ChatResumeDrawerProps {
39
44
  };
40
45
  onResume: (prompt?: string) => void;
41
46
  isLoading?: boolean;
47
+ showFunctionCache?: boolean;
48
+ showMessageConsumption?: boolean;
42
49
  }
43
50
 
44
- const ANIMATION_DURATION_MS = 280;
45
51
  const EMPTY_MEMORI = {
46
52
  memoriID: 'chat-resume-drawer',
47
53
  name: 'AI',
@@ -71,75 +77,19 @@ const ChatResumeDrawer = ({
71
77
  onResume,
72
78
  isLoading = false,
73
79
  onExportChat,
80
+ showFunctionCache = false,
81
+ showMessageConsumption = false,
74
82
  }: ChatResumeDrawerProps) => {
75
83
  const { t } = useTranslation();
76
- const dialogRef = useRef<HTMLDivElement>(null);
77
- const panelRef = useRef<HTMLDivElement>(null);
84
+ const surfaceEl = useWidgetSurfaceEl();
78
85
  const backButtonRef = useRef<HTMLButtonElement>(null);
79
86
  const titleId = 'chat-resume-drawer-title';
80
- const [shouldRender, setShouldRender] = useState(isOpen);
81
- const [isVisible, setIsVisible] = useState(isOpen);
82
-
83
- useEffect(() => {
84
- if (isOpen) {
85
- setShouldRender(true);
86
- requestAnimationFrame(() => setIsVisible(true));
87
- return;
88
- }
89
-
90
- setIsVisible(false);
91
- const timeout = window.setTimeout(() => {
92
- setShouldRender(false);
93
- }, ANIMATION_DURATION_MS);
94
-
95
- return () => window.clearTimeout(timeout);
96
- }, [isOpen]);
97
87
 
98
88
  useEffect(() => {
99
89
  if (!isOpen) return;
100
90
  backButtonRef.current?.focus();
101
91
  }, [isOpen]);
102
92
 
103
- useEffect(() => {
104
- if (!isOpen || embedded) return;
105
-
106
- const previouslyFocused = document.activeElement as HTMLElement | null;
107
- const root = dialogRef.current;
108
- if (!root) return;
109
-
110
- const handleKeyDown = (event: KeyboardEvent) => {
111
- if (event.key === 'Escape') {
112
- onClose();
113
- return;
114
- }
115
-
116
- if (event.key !== 'Tab') return;
117
-
118
- const focusableElements = root.querySelectorAll<HTMLElement>(
119
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
120
- );
121
- if (!focusableElements.length) return;
122
-
123
- const first = focusableElements[0];
124
- const last = focusableElements[focusableElements.length - 1];
125
- const active = document.activeElement as HTMLElement | null;
126
-
127
- if (event.shiftKey && active === first) {
128
- event.preventDefault();
129
- last.focus();
130
- } else if (!event.shiftKey && active === last) {
131
- event.preventDefault();
132
- first.focus();
133
- }
134
- };
135
-
136
- document.addEventListener('keydown', handleKeyDown);
137
- return () => {
138
- document.removeEventListener('keydown', handleKeyDown);
139
- previouslyFocused?.focus();
140
- };
141
- }, [embedded, isOpen, onClose]);
142
-
143
93
  const safeTitle = useMemo(() => {
144
94
  const cleaned = stripMarkdownChars(stripHTML(session.title || ''));
145
95
  return cleaned || 'Conversazione';
@@ -170,15 +120,11 @@ const ChatResumeDrawer = ({
170
120
  [session.messages]
171
121
  );
172
122
 
173
- if (!embedded && !shouldRender) return null;
174
-
175
123
  const content = (
176
124
  <div
177
- ref={panelRef}
178
125
  className={`memori-chat-resume-drawer--panel ${
179
126
  embedded ? 'memori-chat-resume-drawer--panel-embedded' : ''
180
127
  }`}
181
- onClick={event => event.stopPropagation()}
182
128
  >
183
129
  <header className="memori-chat-resume-drawer--header">
184
130
  <Button
@@ -247,6 +193,8 @@ const ChatResumeDrawer = ({
247
193
  showCopyButton={true}
248
194
  isHistoryView={true}
249
195
  isChatlogPanel={true}
196
+ showFunctionCache={showFunctionCache}
197
+ showMessageConsumption={showMessageConsumption}
250
198
  />
251
199
  </div>
252
200
  )}
@@ -266,29 +214,24 @@ const ChatResumeDrawer = ({
266
214
  );
267
215
 
268
216
  if (embedded) {
217
+ if (!isOpen) return null;
269
218
  return (
270
219
  <div className="memori-chat-resume-drawer--embedded-shell">{content}</div>
271
220
  );
272
221
  }
273
222
 
274
223
  return (
275
- <div
276
- ref={dialogRef}
277
- className={`memori-chat-resume-drawer ${
278
- isVisible ? 'memori-chat-resume-drawer--open' : ''
279
- }`}
280
- role="dialog"
281
- aria-modal="true"
282
- aria-labelledby={titleId}
224
+ <Drawer
225
+ container={surfaceEl ?? undefined}
226
+ open={isOpen}
227
+ onClose={onClose}
228
+ className="memori-chat-resume-drawer"
229
+ anchor="right"
230
+ size="md"
231
+ showCloseButton={false}
283
232
  >
284
- <Button
285
- className="memori-chat-resume-drawer--backdrop"
286
- type="button"
287
- aria-label={String(t('close', { defaultValue: 'Close' }))}
288
- onClick={onClose}
289
- />
290
233
  {content}
291
- </div>
234
+ </Drawer>
292
235
  );
293
236
  };
294
237
 
@@ -8,7 +8,7 @@ import './ChatInputs.css';
8
8
  import { AlertProvider } from '@memori.ai/ui';
9
9
 
10
10
  const meta: Meta = {
11
- title: 'Widget/Chat inputs (footer)',
11
+ title: 'Compositions/Chat inputs',
12
12
  component: ChatInputs,
13
13
  argTypes: {
14
14
  disabled: {
@@ -192,44 +192,6 @@ Disabled.args = {
192
192
  showMicrophone: true,
193
193
  };
194
194
 
195
- export const ContinuousSpeech = Template.bind({});
196
- ContinuousSpeech.args = {
197
- dialogState,
198
- userMessage: 'Suspendisse sit amet volutpat velit.',
199
- sendMessage: (msg: string) => console.log(msg),
200
- onTextareaBlur: () => {},
201
- onTextareaFocus: () => {},
202
- onTextareaPressEnter: () => {},
203
- setAttachmentsMenuOpen: () => {},
204
- setSendOnEnter: () => {},
205
- listening: false,
206
- isPlayingAudio: false,
207
- stopAudio: () => {},
208
- startListening: () => {},
209
- stopListening: () => {},
210
- showMicrophone: true,
211
- microphoneMode: 'CONTINUOUS',
212
- };
213
-
214
- export const ContinuousSpeechListening = Template.bind({});
215
- ContinuousSpeechListening.args = {
216
- dialogState,
217
- userMessage: 'Suspendisse sit amet volutpat velit.',
218
- sendMessage: (msg: string) => console.log(msg),
219
- onTextareaBlur: () => {},
220
- onTextareaFocus: () => {},
221
- onTextareaPressEnter: () => {},
222
- setAttachmentsMenuOpen: () => {},
223
- setSendOnEnter: () => {},
224
- listening: true,
225
- isPlayingAudio: false,
226
- stopAudio: () => {},
227
- startListening: () => {},
228
- stopListening: () => {},
229
- showMicrophone: true,
230
- microphoneMode: 'CONTINUOUS',
231
- };
232
-
233
195
  export const WithUploadButton = Template.bind({});
234
196
  WithUploadButton.args = {
235
197
  showUpload: true,
@@ -0,0 +1,47 @@
1
+ import React from 'react';
2
+ import { render } from '../../testUtils';
3
+ import ChatInputs from './ChatInputs';
4
+ import { dialogState, sessionID } from '../../mocks/data';
5
+
6
+ const baseProps = {
7
+ dialogState,
8
+ sessionID,
9
+ userMessage: '',
10
+ sendOnEnter: 'keypress' as const,
11
+ setSendOnEnter: jest.fn(),
12
+ setAttachmentsMenuOpen: jest.fn(),
13
+ onChangeUserMessage: jest.fn(),
14
+ sendMessage: jest.fn(),
15
+ onTextareaFocus: jest.fn(),
16
+ onTextareaBlur: jest.fn(),
17
+ stopAudio: jest.fn(),
18
+ startListening: jest.fn(),
19
+ stopListening: jest.fn(),
20
+ showMicrophone: true,
21
+ microphoneMode: 'CONTINUOUS' as const,
22
+ };
23
+
24
+ it('disables the microphone while the agent is typing', () => {
25
+ const { container } = render(<ChatInputs {...baseProps} isTyping />);
26
+ const mic = container.querySelector('.memori-chat-inputs--mic-btn');
27
+ expect(mic).toBeDisabled();
28
+ });
29
+
30
+ it('keeps the microphone enabled when the agent is idle', () => {
31
+ const { container } = render(<ChatInputs {...baseProps} isTyping={false} />);
32
+ const mic = container.querySelector('.memori-chat-inputs--mic-btn');
33
+ expect(mic).not.toBeDisabled();
34
+ });
35
+
36
+ it('stops listening when the agent starts typing', () => {
37
+ const stopListening = jest.fn();
38
+ render(
39
+ <ChatInputs
40
+ {...baseProps}
41
+ listening
42
+ isTyping
43
+ stopListening={stopListening}
44
+ />
45
+ );
46
+ expect(stopListening).toHaveBeenCalled();
47
+ });
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useState } from 'react';
1
+ import React, { useCallback, useEffect, useState } from 'react';
2
2
  import { DialogState, Medium } from '@memori.ai/memori-api-client/dist/types';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import ChatTextArea from '../ChatTextArea/ChatTextArea';
@@ -353,7 +353,17 @@ ${text}
353
353
  !hasActiveSession ||
354
354
  ['R2', 'R3', 'R4', 'R5', 'G3', 'X3'].includes(dialogState?.state || '');
355
355
  const microphoneDisabled =
356
- isDisabled || textareaDisabled || !hasActiveSession || !hasChatStarted;
356
+ isDisabled ||
357
+ textareaDisabled ||
358
+ !hasActiveSession ||
359
+ !hasChatStarted ||
360
+ isTyping;
361
+
362
+ useEffect(() => {
363
+ if (isTyping && listening) {
364
+ stopListening();
365
+ }
366
+ }, [isTyping, listening, stopListening]);
357
367
 
358
368
  return (
359
369
  <div className="memori-chat-inputs-wrapper">
@@ -187,7 +187,7 @@ button.memori-chat-textarea--expand-button:focus {
187
187
  }
188
188
 
189
189
  [data-theme='dark'] textarea.memori-chat-textarea--input::placeholder {
190
- color: var(--memori-text-color-muted, rgba(255, 255, 255, 0.5));
190
+ color: var(--memori-neutral, rgba(255, 255, 255, 0.5));
191
191
  }
192
192
 
193
193
  /* Layout-scoped dark pills: keep exact text/placeholder colors */
@@ -55,7 +55,7 @@ const getStatusMessage = (status: string): string => {
55
55
  };
56
56
 
57
57
  const meta: Meta = {
58
- title: 'Completion Provider Status',
58
+ title: 'Internals/Completion Provider Status',
59
59
  component: CompletionProviderStatus as React.ComponentType<any>,
60
60
  parameters: {
61
61
  layout: 'centered',
@@ -1,14 +1,5 @@
1
1
  /* ContentPreviewModal – modern preview modal for files and media */
2
-
3
- /*
4
- * @memori.ai/ui Modal uses memori-modal__backdrop (z-index 40) and memori-modal__viewport (z-index 50);
5
- * drawers use z-index 1001. className is applied to the viewport; raise both layers so previews
6
- * stack above chat history and artifact drawers.
7
- */
8
- .memori-modal__backdrop.memori-content-preview-modal-backdrop,
9
- .memori-content-preview-modal.memori-modal__viewport {
10
- z-index: 2147483647 !important;
11
- }
2
+ /* Stacking above drawers: Modal stacking="stacked" (library z-index 1600). */
12
3
 
13
4
  .memori-content-preview-modal.memori-modal__viewport .memori-modal__popup {
14
5
  overflow: hidden;
@@ -36,7 +36,7 @@ const ContentPreviewModal: FC<ContentPreviewModalProps> = ({
36
36
  onClose={() => onClose()}
37
37
  width={width}
38
38
  widthMd={width}
39
- backdropClassName="memori-content-preview-modal-backdrop"
39
+ stacking="stacked"
40
40
  className={cx('memori-content-preview-modal', className, {
41
41
  'memori-content-preview-modal--image': isImage,
42
42
  })}
@@ -1,10 +1,4 @@
1
1
 
2
- .memori--experts-drawer .memori-drawer--panel {
3
- --memori-drawer--width: 100%;
4
- --memori-drawer--width--md: 60%;
5
- --memori-drawer--width--lg: 40%;
6
- }
7
-
8
2
  h2.memori--experts-drawer--title {
9
3
  margin: 0;
10
4
  font-size: inherit;
@@ -6,7 +6,7 @@ import { tenant, expertReference } from '../../mocks/data';
6
6
  import './ExpertsDrawer.css';
7
7
 
8
8
  const meta: Meta = {
9
- title: 'Widget/ExpertsDrawer',
9
+ title: 'Surfaces/ExpertsDrawer',
10
10
  component: ExpertsDrawer,
11
11
  argTypes: {
12
12
  open: {
@@ -5,22 +5,16 @@ import FeedbackButtons, { Props } from './FeedbackButtons';
5
5
  import { memori } from '../../mocks/data';
6
6
 
7
7
  import './FeedbackButtons.css';
8
- import { AlertProvider } from '@memori.ai/ui';
8
+ import { AlertProvider, AlertViewport } from '@memori.ai/ui';
9
9
 
10
10
  const meta: Meta = {
11
- title: 'Feedback Buttons',
11
+ title: 'Internals/Feedback Buttons',
12
12
  component: FeedbackButtons,
13
13
  argTypes: {},
14
14
  parameters: {
15
15
  controls: { expanded: true },
16
+ layout: 'centered',
16
17
  },
17
- decorators: [
18
- Story => (
19
- <div style={{ textAlign: 'right', padding: '0 3rem' }}>
20
- <Story />
21
- </div>
22
- ),
23
- ],
24
18
  };
25
19
 
26
20
  export default meta;
@@ -28,7 +22,32 @@ export default meta;
28
22
  const Template: Story<Props> = args => (
29
23
  <I18nWrapper>
30
24
  <AlertProvider defaultDuration={5000}>
31
- <FeedbackButtons {...args} />
25
+ <div
26
+ style={{
27
+ display: 'flex',
28
+ alignItems: 'center',
29
+ justifyContent: 'center',
30
+ width: '100%',
31
+ height: '100%',
32
+ }}
33
+ >
34
+ <div
35
+ style={{
36
+ display: 'inline-flex',
37
+ flex: 'none',
38
+ alignItems: 'center',
39
+ padding: '6px 10px',
40
+ borderRadius: 999,
41
+ background:
42
+ 'color-mix(in srgb, var(--memori-main-background, #fff) 92%, transparent)',
43
+ boxShadow:
44
+ '0 4px 16px color-mix(in srgb, var(--memori-text-color, #111827) 18%, transparent)',
45
+ }}
46
+ >
47
+ <FeedbackButtons {...args} />
48
+ </div>
49
+ </div>
50
+ <AlertViewport />
32
51
  </AlertProvider>
33
52
  </I18nWrapper>
34
53
  );
@@ -24,7 +24,7 @@
24
24
  padding: var(--memori-spacing-md);
25
25
  border: 1px solid rgba(0, 0, 0, 0.06);
26
26
  border-radius: 14px;
27
- background: var(--memori-background, #fff);
27
+ background: var(--memori-secondary-background, #fff);
28
28
  box-shadow: var(--memori-shadow-lg);
29
29
  }
30
30
 
@@ -161,7 +161,7 @@
161
161
  .memori-dropdown--user-email {
162
162
  overflow: hidden;
163
163
  margin: 0;
164
- color: var(--memori-text-muted, #666);
164
+ color: var(--memori-neutral, #666);
165
165
  font-size: 0.875rem;
166
166
  line-height: 1.35;
167
167
  text-overflow: ellipsis;
@@ -316,7 +316,7 @@
316
316
  height: 0.5rem;
317
317
  border-radius: 50%;
318
318
  background: #22c55e;
319
- box-shadow: 0 0 0 2px var(--memori-secondary-background, var(--memori-background, #fff));
319
+ box-shadow: 0 0 0 2px var(--memori-secondary-background, var(--memori-secondary-background, #fff));
320
320
  content: '';
321
321
  pointer-events: none;
322
322
  }
@@ -513,6 +513,11 @@
513
513
  margin-left: -10px;
514
514
  }
515
515
 
516
+ /* Nested inside the session Popover (z-index 1300); default Dropdown is 1001. */
517
+ .memori-dropdown__positioner:has(.memori-dropdown--sustainability-menu) {
518
+ z-index: 1400;
519
+ }
520
+
516
521
  .memori-dropdown--sustainability-title {
517
522
  padding-bottom: 12px;
518
523
  border-bottom: 1px solid rgba(15, 23, 42, 0.08);
@@ -11,7 +11,7 @@ import './Header.css';
11
11
  import { AlertProvider } from '@memori.ai/ui';
12
12
 
13
13
  const meta: Meta = {
14
- title: 'Widget/Header',
14
+ title: 'Compositions/Header',
15
15
  component: Header,
16
16
  argTypes: {
17
17
  showShare: {