@memori.ai/memori-react 9.0.0-alpha.24 → 9.0.0-alpha.25

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 (265) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +1 -3
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  4. package/dist/components/Auth/Auth.js +1 -3
  5. package/dist/components/Auth/Auth.js.map +1 -1
  6. package/dist/components/Chat/Chat.css +10 -1
  7. package/dist/components/Chat/Chat.js +1 -3
  8. package/dist/components/Chat/Chat.js.map +1 -1
  9. package/dist/components/ChatBubble/ChatBubble.css +103 -5
  10. package/dist/components/ChatBubble/ChatBubble.js +48 -8
  11. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  12. package/dist/components/ChatHistoryDrawer/ChatHistory.js +1 -3
  13. package/dist/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  14. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.css +33 -10
  15. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.js +2 -4
  16. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  17. package/dist/components/ChatInputs/ChatInputs.css +17 -52
  18. package/dist/components/ChatInputs/ChatInputs.js +1 -3
  19. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  20. package/dist/components/ContentPreviewModal/ContentPreviewModal.css +3 -3
  21. package/dist/components/ContentPreviewModal/ContentPreviewModal.js +1 -3
  22. package/dist/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  23. package/dist/components/DateSelector/DateSelector.css +66 -3
  24. package/dist/components/DateSelector/DateSelector.js +5 -1
  25. package/dist/components/DateSelector/DateSelector.js.map +1 -1
  26. package/dist/components/ExpertsDrawer/ExpertsDrawer.js +1 -3
  27. package/dist/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
  28. package/dist/components/FilePreview/FilePreview.css +94 -220
  29. package/dist/components/FilePreview/FilePreview.js +25 -71
  30. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  31. package/dist/components/IconButton/IconButton.css +2 -11
  32. package/dist/components/KnownFacts/KnownFacts.css +3 -4
  33. package/dist/components/KnownFacts/KnownFacts.js +3 -5
  34. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  35. package/dist/components/LoginDrawer/LoginDrawer.css +3 -7
  36. package/dist/components/LoginDrawer/LoginDrawer.js +51 -9
  37. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  38. package/dist/components/MediaWidget/MediaItemWidget.css +77 -57
  39. package/dist/components/MediaWidget/MediaItemWidget.js +4 -4
  40. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  41. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +1 -1
  42. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -5
  43. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  44. package/dist/components/MemoriWidget/MemoriWidget.css +0 -55
  45. package/dist/components/MemoriWidget/MemoriWidget.js +115 -117
  46. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  47. package/dist/components/MobileSessionPanel/MobileSessionPanel.css +20 -0
  48. package/dist/components/MobileSessionPanel/MobileSessionPanel.js +77 -117
  49. package/dist/components/MobileSessionPanel/MobileSessionPanel.js.map +1 -1
  50. package/dist/components/PositionPopover/PositionPopover.css +1 -1
  51. package/dist/components/SettingsDrawer/SettingsDrawer.js +1 -3
  52. package/dist/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  53. package/dist/components/StartPanel/StartPanel.css +12 -1
  54. package/dist/components/StartPanel/StartPanel.js +30 -7
  55. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  56. package/dist/components/UploadButton/UploadButton.css +7 -7
  57. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +1 -3
  58. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  59. package/dist/components/UploadButton/UploadImages/UploadImages.js +1 -3
  60. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  61. package/dist/components/WhyThisAnswer/WhyThisAnswer.js +1 -3
  62. package/dist/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  63. package/dist/components/layouts/HiddenChat.js +9 -1
  64. package/dist/components/layouts/HiddenChat.js.map +1 -1
  65. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js +84 -5
  66. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  67. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +36 -12
  68. package/dist/components/layouts/fullpage.css +1 -0
  69. package/dist/components/layouts/hidden-chat.css +29 -5
  70. package/dist/helpers/error.js +2 -1
  71. package/dist/helpers/error.js.map +1 -1
  72. package/dist/helpers/positionPopover.d.ts +1 -0
  73. package/dist/helpers/positionPopover.js +7 -0
  74. package/dist/helpers/positionPopover.js.map +1 -1
  75. package/dist/helpers/usePressTooltip.d.ts +6 -1
  76. package/dist/helpers/usePressTooltip.js +16 -1
  77. package/dist/helpers/usePressTooltip.js.map +1 -1
  78. package/dist/locales/de.json +8 -2
  79. package/dist/locales/en.json +6 -3
  80. package/dist/locales/es.json +6 -3
  81. package/dist/locales/fr.json +6 -3
  82. package/dist/locales/it.json +6 -3
  83. package/dist/styles.css +1 -1
  84. package/dist/version.d.ts +1 -1
  85. package/dist/version.js +1 -1
  86. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +1 -3
  87. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  88. package/esm/components/Auth/Auth.js +1 -3
  89. package/esm/components/Auth/Auth.js.map +1 -1
  90. package/esm/components/Chat/Chat.css +10 -1
  91. package/esm/components/Chat/Chat.js +1 -3
  92. package/esm/components/Chat/Chat.js.map +1 -1
  93. package/esm/components/ChatBubble/ChatBubble.css +103 -5
  94. package/esm/components/ChatBubble/ChatBubble.js +48 -8
  95. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  96. package/esm/components/ChatHistoryDrawer/ChatHistory.js +1 -3
  97. package/esm/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  98. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.css +33 -10
  99. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js +2 -4
  100. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  101. package/esm/components/ChatInputs/ChatInputs.css +17 -52
  102. package/esm/components/ChatInputs/ChatInputs.js +1 -3
  103. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  104. package/esm/components/ContentPreviewModal/ContentPreviewModal.css +3 -3
  105. package/esm/components/ContentPreviewModal/ContentPreviewModal.js +1 -3
  106. package/esm/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  107. package/esm/components/DateSelector/DateSelector.css +66 -3
  108. package/esm/components/DateSelector/DateSelector.js +5 -1
  109. package/esm/components/DateSelector/DateSelector.js.map +1 -1
  110. package/esm/components/ExpertsDrawer/ExpertsDrawer.js +1 -3
  111. package/esm/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
  112. package/esm/components/FilePreview/FilePreview.css +94 -220
  113. package/esm/components/FilePreview/FilePreview.js +25 -71
  114. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  115. package/esm/components/IconButton/IconButton.css +2 -11
  116. package/esm/components/KnownFacts/KnownFacts.css +3 -4
  117. package/esm/components/KnownFacts/KnownFacts.js +3 -5
  118. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  119. package/esm/components/LoginDrawer/LoginDrawer.css +3 -7
  120. package/esm/components/LoginDrawer/LoginDrawer.js +51 -9
  121. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  122. package/esm/components/MediaWidget/MediaItemWidget.css +77 -57
  123. package/esm/components/MediaWidget/MediaItemWidget.js +5 -5
  124. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  125. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +1 -1
  126. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -5
  127. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  128. package/esm/components/MemoriWidget/MemoriWidget.css +0 -55
  129. package/esm/components/MemoriWidget/MemoriWidget.js +115 -117
  130. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  131. package/esm/components/MobileSessionPanel/MobileSessionPanel.css +20 -0
  132. package/esm/components/MobileSessionPanel/MobileSessionPanel.js +78 -118
  133. package/esm/components/MobileSessionPanel/MobileSessionPanel.js.map +1 -1
  134. package/esm/components/PositionPopover/PositionPopover.css +1 -1
  135. package/esm/components/SettingsDrawer/SettingsDrawer.js +1 -3
  136. package/esm/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  137. package/esm/components/StartPanel/StartPanel.css +12 -1
  138. package/esm/components/StartPanel/StartPanel.js +30 -7
  139. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  140. package/esm/components/UploadButton/UploadButton.css +7 -7
  141. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +1 -3
  142. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  143. package/esm/components/UploadButton/UploadImages/UploadImages.js +1 -3
  144. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  145. package/esm/components/WhyThisAnswer/WhyThisAnswer.js +1 -3
  146. package/esm/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  147. package/esm/components/layouts/HiddenChat.js +9 -1
  148. package/esm/components/layouts/HiddenChat.js.map +1 -1
  149. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js +85 -6
  150. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  151. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +36 -12
  152. package/esm/components/layouts/fullpage.css +1 -0
  153. package/esm/components/layouts/hidden-chat.css +29 -5
  154. package/esm/helpers/error.js +2 -1
  155. package/esm/helpers/error.js.map +1 -1
  156. package/esm/helpers/positionPopover.d.ts +1 -0
  157. package/esm/helpers/positionPopover.js +6 -0
  158. package/esm/helpers/positionPopover.js.map +1 -1
  159. package/esm/helpers/usePressTooltip.d.ts +6 -1
  160. package/esm/helpers/usePressTooltip.js +17 -2
  161. package/esm/helpers/usePressTooltip.js.map +1 -1
  162. package/esm/locales/de.json +8 -2
  163. package/esm/locales/en.json +6 -3
  164. package/esm/locales/es.json +6 -3
  165. package/esm/locales/fr.json +6 -3
  166. package/esm/locales/it.json +6 -3
  167. package/esm/styles.css +1 -1
  168. package/esm/version.d.ts +1 -1
  169. package/esm/version.js +1 -1
  170. package/package.json +4 -3
  171. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +0 -3
  172. package/src/components/Auth/Auth.tsx +0 -3
  173. package/src/components/Auth/__snapshots__/Auth.test.tsx.snap +1 -0
  174. package/src/components/BlockedMemoriBadge/__snapshots__/BlockedMemoriBadge.test.tsx.snap +5 -0
  175. package/src/components/Chat/Chat.css +10 -1
  176. package/src/components/Chat/Chat.tsx +0 -3
  177. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +1735 -1765
  178. package/src/components/ChatBubble/ChatBubble.css +103 -5
  179. package/src/components/ChatBubble/ChatBubble.test.tsx +33 -0
  180. package/src/components/ChatBubble/ChatBubble.tsx +524 -273
  181. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +655 -684
  182. package/src/components/ChatHistoryDrawer/ChatHistory.tsx +0 -3
  183. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.css +33 -10
  184. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.tsx +3 -6
  185. package/src/components/ChatInputs/ChatInputs.css +17 -52
  186. package/src/components/ChatInputs/ChatInputs.tsx +2 -4
  187. package/src/components/CompletionProviderStatus/__snapshots__/CompletionProviderStatus.test.tsx.snap +3 -0
  188. package/src/components/ContentPreviewModal/ContentPreviewModal.css +3 -3
  189. package/src/components/ContentPreviewModal/ContentPreviewModal.tsx +0 -3
  190. package/src/components/DateSelector/DateSelector.css +66 -3
  191. package/src/components/DateSelector/DateSelector.test.tsx +33 -4
  192. package/src/components/DateSelector/DateSelector.tsx +37 -11
  193. package/src/components/ExpertsDrawer/ExpertsDrawer.tsx +0 -3
  194. package/src/components/FeedbackButtons/__snapshots__/FeedbackButtons.test.tsx.snap +2 -1
  195. package/src/components/FilePreview/FilePreview.css +94 -220
  196. package/src/components/FilePreview/FilePreview.tsx +77 -124
  197. package/src/components/FilePreview/__snapshots__/FilePreview.test.tsx.snap +33 -81
  198. package/src/components/Header/ChatConsumptionDropdown.test.tsx +53 -86
  199. package/src/components/Header/__snapshots__/Header.test.tsx.snap +60 -44
  200. package/src/components/IconButton/IconButton.css +2 -11
  201. package/src/components/KnownFacts/KnownFacts.css +3 -4
  202. package/src/components/KnownFacts/KnownFacts.tsx +0 -5
  203. package/src/components/KnownFacts/__snapshots__/KnownFacts.test.tsx.snap +2 -6
  204. package/src/components/LoginDrawer/LoginDrawer.css +3 -7
  205. package/src/components/LoginDrawer/LoginDrawer.tsx +101 -54
  206. package/src/components/LoginDrawer/__snapshots__/LoginDrawer.test.tsx.snap +11 -33
  207. package/src/components/MediaWidget/MediaItemWidget.css +77 -57
  208. package/src/components/MediaWidget/MediaItemWidget.test.tsx +33 -0
  209. package/src/components/MediaWidget/MediaItemWidget.tsx +6 -12
  210. package/src/components/MediaWidget/__snapshots__/MediaItemWidget.test.tsx.snap +2 -0
  211. package/src/components/MediaWidget/__snapshots__/MediaWidget.test.tsx.snap +1 -1
  212. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +1 -1
  213. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +0 -5
  214. package/src/components/MemoriWidget/MemoriUIProvider.contract.test.tsx +25 -7
  215. package/src/components/MemoriWidget/MemoriWidget.css +0 -55
  216. package/src/components/MemoriWidget/MemoriWidget.tsx +18 -12
  217. package/src/components/MobileSessionPanel/MobileSessionPanel.css +20 -0
  218. package/src/components/MobileSessionPanel/MobileSessionPanel.tsx +29 -68
  219. package/src/components/PositionPopover/PositionPopover.css +1 -1
  220. package/src/components/SettingsDrawer/SettingsDrawer.tsx +0 -3
  221. package/src/components/ShareButton/__snapshots__/ShareButton.test.tsx.snap +9 -9
  222. package/src/components/Snippet/__snapshots__/Snippet.test.tsx.snap +8 -0
  223. package/src/components/StartPanel/StartPanel.css +12 -1
  224. package/src/components/StartPanel/StartPanel.test.tsx +57 -0
  225. package/src/components/StartPanel/StartPanel.tsx +41 -4
  226. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +41 -6
  227. package/src/components/UploadButton/UploadButton.css +7 -7
  228. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +0 -3
  229. package/src/components/UploadButton/UploadImages/UploadImages.tsx +0 -3
  230. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +8 -10
  231. package/src/components/WhyThisAnswer/WhyThisAnswer.tsx +0 -3
  232. package/src/components/WhyThisAnswer/__snapshots__/WhyThisAnswer.test.tsx.snap +3 -9
  233. package/src/components/layouts/HiddenChat.tsx +9 -1
  234. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.tsx +103 -6
  235. package/src/components/layouts/WebsiteAssistant/__snapshots__/WebsiteAssistant.test.tsx.snap +63 -57
  236. package/src/components/layouts/WebsiteAssistant/website-assistant.css +36 -12
  237. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +7 -4
  238. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +12 -8
  239. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +7 -4
  240. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +10 -5
  241. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +6 -4
  242. package/src/components/layouts/fullpage.css +1 -0
  243. package/src/components/layouts/hidden-chat.css +29 -5
  244. package/src/components/layouts/layouts.stories.tsx +2 -2
  245. package/src/helpers/error.ts +2 -1
  246. package/src/helpers/positionPopover.test.ts +15 -0
  247. package/src/helpers/positionPopover.ts +16 -0
  248. package/src/helpers/usePressTooltip.test.ts +30 -0
  249. package/src/helpers/usePressTooltip.ts +31 -1
  250. package/src/index.tsx +1 -1
  251. package/src/locales/de.json +8 -2
  252. package/src/locales/en.json +6 -3
  253. package/src/locales/es.json +6 -3
  254. package/src/locales/fr.json +6 -3
  255. package/src/locales/it.json +6 -3
  256. package/src/styles.brandTokens.test.js +52 -0
  257. package/src/styles.css +27 -2
  258. package/src/version.ts +1 -1
  259. package/dist/context/widgetSurfaceContext.d.ts +0 -3
  260. package/dist/context/widgetSurfaceContext.js +0 -11
  261. package/dist/context/widgetSurfaceContext.js.map +0 -1
  262. package/esm/context/widgetSurfaceContext.d.ts +0 -3
  263. package/esm/context/widgetSurfaceContext.js +0 -7
  264. package/esm/context/widgetSurfaceContext.js.map +0 -1
  265. package/src/context/widgetSurfaceContext.tsx +0 -14
@@ -43,7 +43,7 @@ exports[`renders MediaWidget with links unchanged 1`] = `
43
43
  class="memori-media-items"
44
44
  >
45
45
  <div
46
- class="memori-media-items--grid memori-chat-scroll-item memori-media-items--agent"
46
+ class="memori-media-items--grid memori-chat-scroll-item memori-media-items--agent memori-media-items--single"
47
47
  >
48
48
  <div
49
49
  class="memori-media-item"
@@ -300,7 +300,7 @@
300
300
  /* Toast Notifications */
301
301
  .memori-copy-toast {
302
302
  position: fixed;
303
- z-index: 10000;
303
+ z-index: calc(var(--memori-z-index-base, 0) + 1700);
304
304
  top: 20px;
305
305
  right: 20px;
306
306
  display: flex;
@@ -7,7 +7,6 @@
7
7
  import React, { useState, useCallback, useMemo, useEffect } from 'react';
8
8
  import { useTranslation } from 'react-i18next';
9
9
  import { Button, Dropdown, Drawer } from '@memori.ai/ui';
10
- import { useWidgetSurfaceEl } from '../../../../context/widgetSurfaceContext';
11
10
  import {
12
11
  X,
13
12
  Maximize,
@@ -34,7 +33,6 @@ const ArtifactDrawer: React.FC<{
34
33
  * component falls back to the Drawer overlay regardless of this flag. */
35
34
  isLayoutColumn?: boolean;
36
35
  }> = ({ isChatLogPanel = false, isLayoutColumn = false }) => {
37
- const surfaceEl = useWidgetSurfaceEl();
38
36
  const { state, closeArtifact, toggleFullscreen } = useArtifact();
39
37
  const { t } = useTranslation();
40
38
  const [isMobile, setIsMobile] = useState(false);
@@ -148,7 +146,6 @@ const ArtifactDrawer: React.FC<{
148
146
  // Mobile or legacy: floating Drawer overlay
149
147
  return (
150
148
  <Drawer
151
- container={surfaceEl ?? undefined}
152
149
  open={state.isDrawerOpen}
153
150
  onClose={handleClose}
154
151
  anchor="right"
@@ -172,7 +169,6 @@ const ArtifactDrawer: React.FC<{
172
169
  state.isDrawerOpen,
173
170
  state.isFullscreen,
174
171
  isMobile,
175
- surfaceEl,
176
172
  ]
177
173
  );
178
174
 
@@ -321,7 +317,6 @@ const ArtifactDrawer: React.FC<{
321
317
  placement="bottom"
322
318
  align="end"
323
319
  sideOffset={8}
324
- container={surfaceEl ?? undefined}
325
320
  >
326
321
  <Dropdown.Item
327
322
  className="memori-artifact-action-btn"
@@ -7,14 +7,21 @@ import {
7
7
  } from '@memori.ai/ui';
8
8
 
9
9
  function Probe() {
10
- const portal = usePortalContainer();
10
+ const escapePortal = usePortalContainer(undefined, 'escape');
11
+ const clipPortal = usePortalContainer(undefined, 'clip');
11
12
  const theme = useMemoriTheme();
12
13
  return (
13
14
  <div
14
15
  data-testid="probe"
15
- data-portal-is-root={
16
- portal instanceof HTMLElement &&
17
- portal.getAttribute('data-memori-probe-root') === '1'
16
+ data-escape-is-root={
17
+ escapePortal instanceof HTMLElement &&
18
+ escapePortal.getAttribute('data-memori-probe-root') === '1'
19
+ ? 'yes'
20
+ : 'no'
21
+ }
22
+ data-clip-is-surface={
23
+ clipPortal instanceof HTMLElement &&
24
+ clipPortal.getAttribute('data-memori-probe-surface') === '1'
18
25
  ? 'yes'
19
26
  : 'no'
20
27
  }
@@ -25,6 +32,7 @@ function Probe() {
25
32
 
26
33
  function Harness({ theme }: { theme: 'light' | 'dark' }) {
27
34
  const [root, setRoot] = useState<HTMLDivElement | null>(null);
35
+ const [surface, setSurface] = useState<HTMLDivElement | null>(null);
28
36
  return (
29
37
  <div
30
38
  ref={setRoot}
@@ -32,7 +40,16 @@ function Harness({ theme }: { theme: 'light' | 'dark' }) {
32
40
  data-memori-probe-root="1"
33
41
  data-testid="widget-root"
34
42
  >
35
- <MemoriUIProvider container={root} theme={theme}>
43
+ <div
44
+ ref={setSurface}
45
+ data-memori-probe-surface="1"
46
+ data-testid="widget-surface"
47
+ />
48
+ <MemoriUIProvider
49
+ container={root}
50
+ clipContainer={surface}
51
+ theme={theme}
52
+ >
36
53
  <Probe />
37
54
  </MemoriUIProvider>
38
55
  </div>
@@ -40,7 +57,7 @@ function Harness({ theme }: { theme: 'light' | 'dark' }) {
40
57
  }
41
58
 
42
59
  describe('MemoriUIProvider embed contract', () => {
43
- it('keeps portal target on the widget root and theme in sync with data-theme', async () => {
60
+ it('keeps escape portal on widget root, clip on surface, theme in sync', async () => {
44
61
  render(<Harness theme="dark" />);
45
62
 
46
63
  const root = screen.getByTestId('widget-root');
@@ -48,7 +65,8 @@ describe('MemoriUIProvider embed contract', () => {
48
65
 
49
66
  await waitFor(() => {
50
67
  const probe = screen.getByTestId('probe');
51
- expect(probe).toHaveAttribute('data-portal-is-root', 'yes');
68
+ expect(probe).toHaveAttribute('data-escape-is-root', 'yes');
69
+ expect(probe).toHaveAttribute('data-clip-is-surface', 'yes');
52
70
  expect(probe).toHaveAttribute('data-theme-context', 'dark');
53
71
  });
54
72
  });
@@ -165,61 +165,6 @@
165
165
  display: none;
166
166
  }
167
167
 
168
- /* Close buttons (modals, drawers, popovers) — same square bordered chrome
169
- as header / website-assistant / artifact-drawer IconButton.
170
- @memori.ai/ui defaults these to borderless / circular. */
171
- .memori-modal__close,
172
- .memori-drawer__close,
173
- .memori-popover__close {
174
- display: inline-flex;
175
- width: var(--memori-icon-button-size, 40px);
176
- min-width: var(--memori-icon-button-size, 40px);
177
- height: var(--memori-icon-button-size, 40px);
178
- min-height: var(--memori-icon-button-size, 40px);
179
- box-sizing: border-box;
180
- flex-shrink: 0;
181
- align-items: center;
182
- justify-content: center;
183
- padding: 0;
184
- border: var(--memori-border, 1px) solid color-mix(in srgb, var(--memori-text-color, #111827) 18%, transparent);
185
- border-radius: var(--memori-radius-box);
186
- margin: 0;
187
- background: transparent;
188
- box-shadow: none;
189
- color: var(--memori-icon-button-icon, color-mix(in oklch, var(--memori-text-color, #111827) 72%, transparent));
190
- transform: none;
191
- }
192
-
193
- .memori-popover__close {
194
- block-size: var(--memori-icon-button-size, 40px);
195
- inline-size: var(--memori-icon-button-size, 40px);
196
- }
197
-
198
- .memori-modal__close:hover,
199
- .memori-drawer__close:hover,
200
- .memori-popover__close:hover {
201
- border-color: color-mix(in srgb, var(--memori-text-color, #111827) 18%, transparent);
202
- background: color-mix(in srgb, var(--memori-text-color, #111827) 6%, transparent);
203
- box-shadow: none;
204
- color: var(--memori-text-color, #111827);
205
- }
206
-
207
- .memori-modal__close:focus-visible,
208
- .memori-drawer__close:focus-visible,
209
- .memori-popover__close:focus-visible {
210
- border-color: var(--memori-primary);
211
- box-shadow: var(--memori-focus-ring, 0 0 0 3px color-mix(in oklch, var(--memori-primary) 18%, transparent));
212
- outline: 2px solid var(--memori-primary);
213
- outline-offset: var(--memori-focus-ring-offset, 2px);
214
- }
215
-
216
- .memori-modal__close svg,
217
- .memori-drawer__close svg,
218
- .memori-popover__close svg {
219
- width: var(--memori-icon-button-icon-size, 20px);
220
- height: var(--memori-icon-button-icon-size, 20px);
221
- }
222
-
223
168
  .memori-drawer__header {
224
169
  align-items: center;
225
170
  }
@@ -49,8 +49,6 @@ import {
49
49
  MemoriUIProvider,
50
50
  AlertViewport,
51
51
  } from '@memori.ai/ui';
52
- import { WidgetSurfaceProvider } from '../../context/widgetSurfaceContext';
53
-
54
52
  // Components
55
53
  import MemoriAuth from '../Auth/Auth';
56
54
  import Chat, { Props as ChatProps } from '../Chat/Chat';
@@ -444,7 +442,8 @@ export interface LayoutProps {
444
442
  loading?: boolean;
445
443
  autoStart?: boolean;
446
444
  onSidebarToggle?: (isOpen: boolean) => void;
447
- /** When true or "true" (e.g. from integrationConfig or web component attribute), hide the 3D avatar. */
445
+ /** When true or "true" (e.g. from integrationConfig or web component attribute), hide the 3D avatar.
446
+ * WEBSITE_ASSISTANT defaults to hidden when this is unset. */
448
447
  avatar3dHidden?: boolean | string;
449
448
  /** TOTEM only: max-width of the shared content axis (avatar + panel + status).
450
449
  * Accepts a number (px) or a CSS length string; enables vertical-kiosk widths. */
@@ -482,7 +481,7 @@ export interface Props {
482
481
  showUpload?: boolean;
483
482
  showChatHistory?: boolean;
484
483
  showReasoning?: boolean;
485
- /** When true and layout is WEBSITE_ASSISTANT, hide the 3D avatar in the expanded panel. */
484
+ /** When true (default for WEBSITE_ASSISTANT), hide the 3D avatar in the expanded panel. Set false to show it. */
486
485
  avatar3dHidden?: boolean;
487
486
  preview?: boolean;
488
487
  embed?: boolean;
@@ -530,8 +529,9 @@ type ChatStylesConfig = {
530
529
 
531
530
  /**
532
531
  * Returns CSS custom properties for the chat container when a brand primary is set.
533
- * Sets the UI brand hook (`--memori-primary-color`); hover/active/subtle derive from
534
- * `@memori.ai/ui` theme tokens. Widget-only icon soft fills stay here.
532
+ * Sets the UI brand hook (`--memori-primary-color`); hover/active/disabled/subtle
533
+ * are rebound from that hook in `styles.css` on widget scopes (CSS derives only
534
+ * when computed on the same element as the override). Widget-only icon soft fills stay here.
535
535
  */
536
536
  export function getChatStyles(
537
537
  config: ChatStylesConfig | null | undefined
@@ -3647,7 +3647,8 @@ const MemoriWidget = ({
3647
3647
  position: position,
3648
3648
  setVenue: setPosition,
3649
3649
  openPositionPopover: () => {
3650
- setAutoStartPositionGeolocation(true);
3650
+ // StartPanel starts geolocation in its click handler (mobile Header does
3651
+ // not mount PositionPopover). This only opens the desktop popover UI.
3651
3652
  setPositionPopoverOpen(true);
3652
3653
  },
3653
3654
  integrationConfig: integrationConfig,
@@ -3828,11 +3829,17 @@ const MemoriWidget = ({
3828
3829
  })}
3829
3830
  style={{ height }}
3830
3831
  >
3831
- <MemoriUIProvider container={widgetRootEl} theme={widgetTheme}>
3832
+ <MemoriUIProvider
3833
+ container={widgetRootEl}
3834
+ clipContainer={widgetSurfaceEl}
3835
+ theme={widgetTheme}
3836
+ zIndexBase={
3837
+ selectedLayout === 'WEBSITE_ASSISTANT' ? 10000 : 0
3838
+ }
3839
+ >
3832
3840
  {/* Inside themed root so alert text uses dark-theme tokens (white). */}
3833
- <AlertViewport placement="top-end" style={{ zIndex: 10002 }} />
3834
- <WidgetSurfaceProvider value={widgetSurfaceEl}>
3835
- <div ref={setWidgetSurfaceEl} className="memori-widget__surface">
3841
+ <AlertViewport placement="top-end" />
3842
+ <div ref={setWidgetSurfaceEl} className="memori-widget__surface">
3836
3843
  <Layout
3837
3844
  Header={Header}
3838
3845
  headerProps={headerProps}
@@ -4148,7 +4155,6 @@ const MemoriWidget = ({
4148
4155
  />
4149
4156
  )}
4150
4157
  </div>
4151
- </WidgetSurfaceProvider>
4152
4158
  </MemoriUIProvider>
4153
4159
  </div>
4154
4160
  );
@@ -457,3 +457,23 @@
457
457
  justify-content: flex-end;
458
458
  }
459
459
  }
460
+
461
+ .memori-mobile-session-panel-drawer.memori-drawer--bottom {
462
+ width: 100%;
463
+ max-width: 100%;
464
+ height: auto;
465
+ max-height: 90vh;
466
+ padding: 0;
467
+ border-radius: 20px 20px 0 0;
468
+ }
469
+
470
+ .memori-mobile-session-panel-drawer .memori-drawer__body {
471
+ overflow: auto;
472
+ padding: 0;
473
+ }
474
+
475
+ .memori-mobile-session-panel-drawer .memori-mobile-session-panel {
476
+ max-height: none;
477
+ border-radius: 0;
478
+ }
479
+
@@ -7,7 +7,7 @@ import {
7
7
  LogIn,
8
8
  LogOut,
9
9
  } from 'lucide-react';
10
- import { Button, createAlertOptions, useAlertManager } from '@memori.ai/ui';
10
+ import { Button, Drawer, createAlertOptions, useAlertManager } from '@memori.ai/ui';
11
11
  import { useTranslation } from 'react-i18next';
12
12
  import { Message, User, Venue } from '@memori.ai/memori-api-client/dist/types';
13
13
  import { getErrori18nKey } from '../../helpers/error';
@@ -194,7 +194,6 @@ const MobileSessionPanel: React.FC<MobileSessionPanelProps> = ({
194
194
  const showAuthControls = showLogin;
195
195
  const showProfileControls = showAuthControls && isLoggedIn;
196
196
  const panelRef = useRef<HTMLElement>(null);
197
- const dialogRef = useRef<HTMLDivElement>(null);
198
197
  const panelTitleId = 'mobile-session-panel-title';
199
198
  const touchStartYRef = useRef(0);
200
199
  const [dragOffset, setDragOffset] = useState(0);
@@ -261,58 +260,11 @@ const MobileSessionPanel: React.FC<MobileSessionPanelProps> = ({
261
260
  knownFactsHint || t('widget.knownFactsHint') || 'What I remember about you';
262
261
  const resolvedAiUsageTitle =
263
262
  aiUsageTitle || t('widget.aiConsumption') || 'AI usage';
264
- useEffect(() => {
265
- if (!open) return;
266
- const onEscape = (event: KeyboardEvent) => {
267
- if (event.key === 'Escape') onClose();
268
- };
269
- document.addEventListener('keydown', onEscape);
270
- return () => document.removeEventListener('keydown', onEscape);
271
- }, [open, onClose]);
272
-
273
- useEffect(() => {
274
- if (!open) return;
275
-
276
- const previouslyFocused = document.activeElement as HTMLElement | null;
277
- const root = dialogRef.current;
278
- if (!root) return;
279
-
280
- const handleKeyDown = (event: KeyboardEvent) => {
281
- if (event.key !== 'Tab') return;
282
-
283
- const focusableElements = root.querySelectorAll<HTMLElement>(
284
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
285
- );
286
- if (!focusableElements.length) return;
287
-
288
- const first = focusableElements[0];
289
- const last = focusableElements[focusableElements.length - 1];
290
- const active = document.activeElement as HTMLElement | null;
291
-
292
- if (event.shiftKey && active === first) {
293
- event.preventDefault();
294
- last.focus();
295
- } else if (!event.shiftKey && active === last) {
296
- event.preventDefault();
297
- first.focus();
298
- }
299
- };
300
-
301
- document.addEventListener('keydown', handleKeyDown);
302
- panelRef.current?.focus();
303
-
304
- return () => {
305
- document.removeEventListener('keydown', handleKeyDown);
306
- previouslyFocused?.focus();
307
- };
308
- }, [open]);
309
263
 
310
264
  useEffect(() => {
311
265
  if (open) setActiveView('session');
312
266
  }, [open]);
313
267
 
314
- if (!open) return null;
315
-
316
268
  const updateAvatar = async (avatar: any) => {
317
269
  if (!uploadAsset || !pwlUpdateUser) {
318
270
  add(
@@ -415,30 +367,15 @@ const MobileSessionPanel: React.FC<MobileSessionPanelProps> = ({
415
367
  return !isKnownFactsAction && !isAudioAction;
416
368
  });
417
369
 
418
- return (
419
- <div
420
- ref={dialogRef}
421
- className={`memori-mobile-session-panel--overlay ${
422
- isPopover ? 'memori-mobile-session-panel--overlay-popover' : ''
423
- }`}
424
- role="presentation"
425
- >
426
- {!isPopover && (
427
- <button
428
- type="button"
429
- className="memori-mobile-session-panel--backdrop"
430
- aria-label={String(t('close', { defaultValue: 'Close' }))}
431
- onClick={onClose}
432
- />
433
- )}
370
+ const panel = (
434
371
  <section
435
372
  ref={panelRef}
436
373
  tabIndex={-1}
437
374
  className={`memori-mobile-session-panel ${
438
375
  isPopover ? 'memori-mobile-session-panel--popover' : ''
439
376
  }`}
440
- role="dialog"
441
- aria-modal="true"
377
+ role={isPopover ? 'dialog' : undefined}
378
+ aria-modal={isPopover ? true : undefined}
442
379
  aria-labelledby={panelTitleId}
443
380
  onClick={event => event.stopPropagation()}
444
381
  onTouchStart={
@@ -809,7 +746,31 @@ const MobileSessionPanel: React.FC<MobileSessionPanelProps> = ({
809
746
  </div>
810
747
  )}
811
748
  </section>
812
- </div>
749
+ );
750
+
751
+ if (isPopover) {
752
+ if (!open) return null;
753
+ return (
754
+ <div
755
+ className="memori-mobile-session-panel--overlay memori-mobile-session-panel--overlay-popover"
756
+ role="presentation"
757
+ >
758
+ {panel}
759
+ </div>
760
+ );
761
+ }
762
+
763
+ return (
764
+ <Drawer
765
+ open={open}
766
+ onClose={onClose}
767
+ anchor="bottom"
768
+ size="lg"
769
+ className="memori-mobile-session-panel-drawer"
770
+ closable={false}
771
+ >
772
+ {panel}
773
+ </Drawer>
813
774
  );
814
775
  };
815
776
 
@@ -215,5 +215,5 @@
215
215
  }
216
216
 
217
217
  .memori-position-popover__positioner--website-assistant {
218
- z-index: 2147483600;
218
+ z-index: calc(var(--memori-z-index-base, 0) + 1300);
219
219
  }
@@ -1,5 +1,4 @@
1
1
  import { Drawer, Checkbox, Button, Slider, Tooltip } from '@memori.ai/ui';
2
- import { useWidgetSurfaceEl } from '../../context/widgetSurfaceContext';
3
2
  import { useTranslation } from 'react-i18next';
4
3
  import { setLocalConfig } from '../../helpers/configuration';
5
4
  import { Props as WidgetProps } from '../MemoriWidget/MemoriWidget';
@@ -47,11 +46,9 @@ const SettingsDrawer = ({
47
46
  isAvatar3d,
48
47
  }: Props) => {
49
48
  const { t } = useTranslation();
50
- const surfaceEl = useWidgetSurfaceEl();
51
49
 
52
50
  return (
53
51
  <Drawer
54
- container={surfaceEl ?? undefined}
55
52
  className="memori-settings-drawer"
56
53
  open={open}
57
54
  onClose={onClose}
@@ -27,7 +27,7 @@ exports[`renders ShareButton aligned left unchanged 1`] = `
27
27
  >
28
28
  <svg
29
29
  aria-hidden="true"
30
- class="lucide lucide-share2"
30
+ class="lucide lucide-share2 lucide-share-2"
31
31
  fill="none"
32
32
  height="24"
33
33
  stroke="currentColor"
@@ -110,7 +110,7 @@ exports[`renders ShareButton unchanged 1`] = `
110
110
  >
111
111
  <svg
112
112
  aria-hidden="true"
113
- class="lucide lucide-share2"
113
+ class="lucide lucide-share2 lucide-share-2"
114
114
  fill="none"
115
115
  height="24"
116
116
  stroke="currentColor"
@@ -193,7 +193,7 @@ exports[`renders ShareButton with button not primary unchanged 1`] = `
193
193
  >
194
194
  <svg
195
195
  aria-hidden="true"
196
- class="lucide lucide-share2"
196
+ class="lucide lucide-share2 lucide-share-2"
197
197
  fill="none"
198
198
  height="24"
199
199
  stroke="currentColor"
@@ -276,7 +276,7 @@ exports[`renders ShareButton with other tenant img set unchanged 1`] = `
276
276
  >
277
277
  <svg
278
278
  aria-hidden="true"
279
- class="lucide lucide-share2"
279
+ class="lucide lucide-share2 lucide-share-2"
280
280
  fill="none"
281
281
  height="24"
282
282
  stroke="currentColor"
@@ -359,7 +359,7 @@ exports[`renders ShareButton with share chat unchanged 1`] = `
359
359
  >
360
360
  <svg
361
361
  aria-hidden="true"
362
- class="lucide lucide-share2"
362
+ class="lucide lucide-share2 lucide-share-2"
363
363
  fill="none"
364
364
  height="24"
365
365
  stroke="currentColor"
@@ -442,7 +442,7 @@ exports[`renders ShareButton with tenant img set unchanged 1`] = `
442
442
  >
443
443
  <svg
444
444
  aria-hidden="true"
445
- class="lucide lucide-share2"
445
+ class="lucide lucide-share2 lucide-share-2"
446
446
  fill="none"
447
447
  height="24"
448
448
  stroke="currentColor"
@@ -525,7 +525,7 @@ exports[`renders ShareButton with title unchanged 1`] = `
525
525
  >
526
526
  <svg
527
527
  aria-hidden="true"
528
- class="lucide lucide-share2"
528
+ class="lucide lucide-share2 lucide-share-2"
529
529
  fill="none"
530
530
  height="24"
531
531
  stroke="currentColor"
@@ -608,7 +608,7 @@ exports[`renders ShareButton with url unchanged 1`] = `
608
608
  >
609
609
  <svg
610
610
  aria-hidden="true"
611
- class="lucide lucide-share2"
611
+ class="lucide lucide-share2 lucide-share-2"
612
612
  fill="none"
613
613
  height="24"
614
614
  stroke="currentColor"
@@ -691,7 +691,7 @@ exports[`renders ShareButton without qr code unchanged 1`] = `
691
691
  >
692
692
  <svg
693
693
  aria-hidden="true"
694
- class="lucide lucide-share2"
694
+ class="lucide lucide-share2 lucide-share-2"
695
695
  fill="none"
696
696
  height="24"
697
697
  stroke="currentColor"
@@ -34,6 +34,7 @@ exports[`renders SnippetUpload with css code 1`] = `
34
34
  class="memori-button__icon"
35
35
  >
36
36
  <svg
37
+ aria-hidden="true"
37
38
  class="lucide lucide-copy"
38
39
  fill="none"
39
40
  height="24"
@@ -97,6 +98,7 @@ exports[`renders SnippetUpload with html code 1`] = `
97
98
  class="memori-button__icon"
98
99
  >
99
100
  <svg
101
+ aria-hidden="true"
100
102
  class="lucide lucide-copy"
101
103
  fill="none"
102
104
  height="24"
@@ -160,6 +162,7 @@ exports[`renders SnippetUpload with js code 1`] = `
160
162
  class="memori-button__icon"
161
163
  >
162
164
  <svg
165
+ aria-hidden="true"
163
166
  class="lucide lucide-copy"
164
167
  fill="none"
165
168
  height="24"
@@ -247,6 +250,7 @@ exports[`renders SnippetUpload with js code without line numbers 1`] = `
247
250
  class="memori-button__icon"
248
251
  >
249
252
  <svg
253
+ aria-hidden="true"
250
254
  class="lucide lucide-copy"
251
255
  fill="none"
252
256
  height="24"
@@ -354,6 +358,7 @@ export default Snippet;
354
358
  class="memori-button__icon"
355
359
  >
356
360
  <svg
361
+ aria-hidden="true"
357
362
  class="lucide lucide-copy"
358
363
  fill="none"
359
364
  height="24"
@@ -461,6 +466,7 @@ export default Snippet;
461
466
  class="memori-button__icon"
462
467
  >
463
468
  <svg
469
+ aria-hidden="true"
464
470
  class="lucide lucide-copy"
465
471
  fill="none"
466
472
  height="24"
@@ -524,6 +530,7 @@ exports[`renders SnippetUpload with text 1`] = `
524
530
  class="memori-button__icon"
525
531
  >
526
532
  <svg
533
+ aria-hidden="true"
527
534
  class="lucide lucide-copy"
528
535
  fill="none"
529
536
  height="24"
@@ -587,6 +594,7 @@ exports[`renders SnippetUpload with text as fallback 1`] = `
587
594
  class="memori-button__icon"
588
595
  >
589
596
  <svg
597
+ aria-hidden="true"
590
598
  class="lucide lucide-copy"
591
599
  fill="none"
592
600
  height="24"
@@ -961,12 +961,23 @@
961
961
  outline-offset: var(--memori-focus-ring-offset);
962
962
  }
963
963
 
964
- /* Portal on widget root; tooltip/popover library z-index is 1300. */
964
+ /* Portal on widget root; tooltip/popover library z-index is 1300.
965
+ Hide while Floating UI is still applying coordinates so click-open
966
+ never flashes at viewport 0,0 (same pattern as ChatBubble addon tooltips). */
965
967
  .memori--privacy-popover-positioner,
966
968
  .memori--deep-thought-helper-tooltip-positioner {
967
969
  z-index: 1300;
968
970
  }
969
971
 
972
+ .memori--privacy-popover-positioner[data-starting-style],
973
+ .memori--privacy-popover-positioner[data-ending-style],
974
+ .memori--deep-thought-helper-tooltip-positioner[data-starting-style],
975
+ .memori--deep-thought-helper-tooltip-positioner[data-ending-style] {
976
+ opacity: 0 !important;
977
+ pointer-events: none;
978
+ visibility: hidden;
979
+ }
980
+
970
981
  .memori--privacy-popover-popup {
971
982
  max-width: min(20rem, calc(100vw - 2 * var(--memori-spacing-md)));
972
983
  max-height: min(50vh, 18rem);