@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
@@ -22,7 +22,6 @@ import { stripAllInternalTags } from '../../helpers/message';
22
22
  import debounce from 'lodash/debounce';
23
23
  import { Spin } from '@memori.ai/ui';
24
24
  import { SelectBox } from '@memori.ai/ui';
25
- import { useWidgetSurfaceEl } from '../../context/widgetSurfaceContext';
26
25
  // Helpers / Utils
27
26
  import { getTranslation } from '../../helpers/translations';
28
27
  import ChatResumeDrawer from './ChatResumeDrawer';
@@ -458,7 +457,6 @@ const ChatHistoryDrawer = ({
458
457
  showFunctionCache = false,
459
458
  showMessageConsumption = false,
460
459
  }: Props) => {
461
- const surfaceEl = useWidgetSurfaceEl();
462
460
  const { t } = useTranslation();
463
461
  const { add } = useAlertManager();
464
462
  const { getUserChatLogsByTokenPaged } = apiClient.chatLogs;
@@ -1171,7 +1169,6 @@ const ChatHistoryDrawer = ({
1171
1169
 
1172
1170
  return (
1173
1171
  <Drawer
1174
- container={surfaceEl ?? undefined}
1175
1172
  className="memori-chat-history-drawer"
1176
1173
  open={open}
1177
1174
  onClose={onClose}
@@ -69,21 +69,44 @@
69
69
  }
70
70
  }
71
71
 
72
- .memori-chat-resume-drawer--header-icon-button {
73
- display: inline-flex;
74
- width: 28px;
75
- min-width: 28px;
76
- height: 28px;
72
+ /* Compact circular header actions — beat UI lib ghost/sm + icon-only 44px touch targets */
73
+ .memori-chat-resume-drawer--header-icon-button.memori-button,
74
+ .memori-chat-resume-drawer--header
75
+ .memori-chat-history-drawer--header-download-button.memori-button {
76
+ display: inline-flex !important;
77
+ width: 36px !important;
78
+ min-width: 36px !important;
79
+ height: 36px !important;
80
+ min-height: 36px !important;
81
+ flex-shrink: 0;
77
82
  align-items: center;
83
+ align-self: center;
78
84
  justify-content: center;
79
- padding: 0;
80
- border: none;
85
+ padding: 0 !important;
86
+ border: none !important;
81
87
  border-radius: 999px;
82
- background: transparent;
88
+ margin: 0;
89
+ background: transparent !important;
90
+ box-shadow: none !important;
83
91
  color: var(--color-text-primary, var(--memori-text-color));
84
92
  cursor: pointer;
85
93
  }
86
94
 
95
+ .memori-chat-resume-drawer--header-icon-button.memori-button:hover:not(:disabled),
96
+ .memori-chat-resume-drawer--header
97
+ .memori-chat-history-drawer--header-download-button.memori-button:hover:not(
98
+ :disabled
99
+ ) {
100
+ background: color-mix(in oklch, var(--memori-text-color) 8%, transparent) !important;
101
+ }
102
+
103
+ .memori-chat-resume-drawer--header-icon-button.memori-button svg,
104
+ .memori-chat-resume-drawer--header
105
+ .memori-chat-history-drawer--header-download-button.memori-button svg {
106
+ width: 18px;
107
+ height: 18px;
108
+ }
109
+
87
110
  .memori-chat-resume-drawer--header-main {
88
111
  min-width: 0;
89
112
  flex: 1;
@@ -316,8 +339,8 @@
316
339
  }
317
340
 
318
341
  .memori-chat-history-drawer--header-download-button {
319
- display: flex;
320
- align-self: baseline;
342
+ display: inline-flex;
343
+ align-self: center;
321
344
  }
322
345
 
323
346
  .memori-chat-resume-drawer--chips-row {
@@ -7,7 +7,6 @@ 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';
11
10
  import Chat from '../Chat/Chat';
12
11
 
13
12
  export interface ResumeDrawerMessage {
@@ -81,7 +80,6 @@ const ChatResumeDrawer = ({
81
80
  showMessageConsumption = false,
82
81
  }: ChatResumeDrawerProps) => {
83
82
  const { t } = useTranslation();
84
- const surfaceEl = useWidgetSurfaceEl();
85
83
  const backButtonRef = useRef<HTMLButtonElement>(null);
86
84
  const titleId = 'chat-resume-drawer-title';
87
85
 
@@ -130,13 +128,13 @@ const ChatResumeDrawer = ({
130
128
  <Button
131
129
  ref={backButtonRef}
132
130
  variant="ghost"
131
+ size="sm"
133
132
  type="button"
134
133
  className="memori-chat-resume-drawer--header-icon-button"
135
134
  onClick={onBack || onClose}
136
135
  aria-label={String(t('back', { defaultValue: 'Back' }))}
137
- >
138
- <ArrowLeft size={16} aria-hidden />
139
- </Button>
136
+ icon={<ArrowLeft aria-hidden />}
137
+ />
140
138
  <div className="memori-chat-resume-drawer--header-main">
141
139
  <h2
142
140
  id={titleId}
@@ -222,7 +220,6 @@ const ChatResumeDrawer = ({
222
220
 
223
221
  return (
224
222
  <Drawer
225
- container={surfaceEl ?? undefined}
226
223
  open={isOpen}
227
224
  onClose={onClose}
228
225
  className="memori-chat-resume-drawer"
@@ -22,18 +22,16 @@
22
22
  box-sizing: border-box;
23
23
  flex-flow: column;
24
24
  flex-shrink: 0;
25
- padding: 0 !important;
26
- border: none;
27
- border-radius: 0;
25
+ padding: 0px;
26
+ border: 1.5px solid var(--memori-border-color, #ddd);
27
+ border-radius: var(--memori-radius-box);
28
28
  margin: 0 auto;
29
+ background: var(--memori-secondary-background);
29
30
  background-color: transparent;
30
31
  box-shadow: none;
32
+ gap: 10px;
31
33
  overflow-x: hidden;
32
- }
33
-
34
- [data-theme='dark'] .memori-chat-inputs,
35
- .memori-chat-inputs[data-theme='dark'] {
36
- background-color: transparent;
34
+ transition: border-color 0.15s, box-shadow 0.15s;
37
35
  }
38
36
 
39
37
  .memori-chat-inputs:disabled {
@@ -41,6 +39,16 @@
41
39
  pointer-events: none;
42
40
  }
43
41
 
42
+ .memori-chat-inputs:focus-within {
43
+ border-color: var(--memori-border-color, #ddd);
44
+ box-shadow: none;
45
+ }
46
+
47
+ .memori-chat-inputs:focus-within:has(:focus-visible) {
48
+ border-color: var(--memori-primary);
49
+ box-shadow: var(--memori-focus-ring, 0 0 0 3px color-mix(in oklch, var(--memori-primary) 18%, transparent));
50
+ }
51
+
44
52
  /* Wrapper so FilePreview horizontal scroll is constrained */
45
53
  .memori-chat-inputs--preview-wrapper {
46
54
  overflow: hidden;
@@ -57,21 +65,6 @@
57
65
  box-sizing: border-box;
58
66
  align-items: center;
59
67
  padding: 10px 12px 10px 16px;
60
- border: 1.5px solid var(--memori-border-color, #ddd);
61
- border-radius: 8px;
62
- margin: 0;
63
- gap: 10px;
64
- transition: border-color 0.15s, box-shadow 0.15s;
65
- }
66
-
67
- .memori-chat-inputs--container:focus-within {
68
- border-color: var(--memori-border-color, #ddd);
69
- box-shadow: none;
70
- }
71
-
72
- .memori-chat-inputs--container:focus-within:has(:focus-visible) {
73
- border-color: var(--memori-primary);
74
- box-shadow: var(--memori-focus-ring, 0 0 0 3px color-mix(in oklch, var(--memori-primary) 18%, transparent));
75
68
  }
76
69
 
77
70
  /* Responsive adjustments */
@@ -422,18 +415,13 @@
422
415
  .memori-widget.memori-layout-zoomed_full_body .memori-chat-inputs {
423
416
  max-width: 100%;
424
417
  margin: 0;
425
- background: transparent;
418
+ /* background: transparent; */
426
419
  }
427
420
 
428
421
  .memori-widget.memori-layout-fullpage .memori-chat-inputs--container,
429
422
  .memori-widget.memori-layout-zoomed_full_body .memori-chat-inputs--container {
430
423
  min-height: 0;
431
424
  padding: 12px;
432
- border: 1.5px solid var(--memori-border-color, #ddd);
433
- border-radius: var(--memori-radius-box);
434
- background: var(--memori-secondary-background);
435
- gap: 10px;
436
- transition: border-color 0.15s, box-shadow 0.15s;
437
425
  }
438
426
 
439
427
  .memori-widget.memori-layout-hidden_chat .memori-chat-inputs--container,
@@ -441,29 +429,6 @@
441
429
  .memori-widget.memori-layout-chat .memori-chat-inputs--container {
442
430
  min-height: 0;
443
431
  padding: 12px;
444
- border: 1.5px solid var(--memori-border-color, #ddd);
445
- border-radius: var(--memori-radius-box);
446
- background: var(--memori-secondary-background);
447
- gap: 8px;
448
- transition: border-color 0.15s, box-shadow 0.15s;
449
- }
450
-
451
- .memori-widget.memori-layout-fullpage .memori-chat-inputs--container:focus-within,
452
- .memori-widget.memori-layout-zoomed_full_body .memori-chat-inputs--container:focus-within,
453
- .memori-widget.memori-layout-hidden_chat .memori-chat-inputs--container:focus-within,
454
- .memori-widget.memori-layout-website_assistant .memori-chat-inputs--container:focus-within,
455
- .memori-widget.memori-layout-chat .memori-chat-inputs--container:focus-within {
456
- border-color: var(--memori-border-color, #ddd);
457
- box-shadow: none;
458
- }
459
-
460
- .memori-widget.memori-layout-fullpage .memori-chat-inputs--container:focus-within:has(:focus-visible),
461
- .memori-widget.memori-layout-zoomed_full_body .memori-chat-inputs--container:focus-within:has(:focus-visible),
462
- .memori-widget.memori-layout-hidden_chat .memori-chat-inputs--container:focus-within:has(:focus-visible),
463
- .memori-widget.memori-layout-website_assistant .memori-chat-inputs--container:focus-within:has(:focus-visible),
464
- .memori-widget.memori-layout-chat .memori-chat-inputs--container:focus-within:has(:focus-visible) {
465
- border-color: var(--memori-primary);
466
- box-shadow: var(--memori-focus-ring, 0 0 0 3px color-mix(in oklch, var(--memori-primary) 18%, transparent));
467
432
  }
468
433
 
469
434
  /* Keep disclaimer + brand on the same axis as the input pill */
@@ -374,10 +374,8 @@ ${text}
374
374
  })}
375
375
  disabled={isDisabled}
376
376
  >
377
- {/* Preview for document files (show when upload enabled or when paste added cards) */}
378
- {(showUpload ||
379
- documentPreviewFiles.length > 0 ||
380
- uploadingCount > 0) && (
377
+ {/* Preview for document files (only when files or uploads are present) */}
378
+ {(documentPreviewFiles.length > 0 || uploadingCount > 0) && (
381
379
  <div className="memori-chat-inputs--preview-wrapper">
382
380
  <FilePreview
383
381
  previewFiles={documentPreviewFiles}
@@ -10,6 +10,7 @@ exports[`renders CompletionProviderStatus errored unchanged 1`] = `
10
10
  id="base-ui-:r3:"
11
11
  >
12
12
  <svg
13
+ aria-hidden="true"
13
14
  class="lucide lucide-triangle-alert memori--completion-provider-status--icon memori--completion-provider-status--icon-error"
14
15
  fill="none"
15
16
  height="24"
@@ -46,6 +47,7 @@ exports[`renders CompletionProviderStatus errored with provider specified unchan
46
47
  id="base-ui-:r5:"
47
48
  >
48
49
  <svg
50
+ aria-hidden="true"
49
51
  class="lucide lucide-triangle-alert memori--completion-provider-status--icon memori--completion-provider-status--icon-error"
50
52
  fill="none"
51
53
  height="24"
@@ -82,6 +84,7 @@ exports[`renders CompletionProviderStatus unchanged 1`] = `
82
84
  id="base-ui-:r1:"
83
85
  >
84
86
  <svg
87
+ aria-hidden="true"
85
88
  class="lucide lucide-triangle-alert memori--completion-provider-status--icon memori--completion-provider-status--icon-error"
86
89
  fill="none"
87
90
  height="24"
@@ -113,10 +113,10 @@
113
113
  min-width: 0;
114
114
  max-width: 100%;
115
115
  min-height: 120px;
116
- border: 1px solid var(--memori-content-preview-snippet-border, #e2e8f0);
116
+ border: 1px solid var(--memori-border-color);
117
117
  border-radius: var(--memori-radius-box);
118
- background: var(--memori-content-preview-snippet-bg, #f8fafc);
119
- color: var(--memori-content-preview-snippet-text, #334155);
118
+ background: var(--memori-main-background);
119
+ color: var(--memori-text-color);
120
120
  font-family: 'SF Mono', 'Fira Code', 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
121
121
  font-size: var(--memori-text-size-small);
122
122
  line-height: var(--memori-text-line-relaxed);
@@ -1,7 +1,6 @@
1
1
  import React, { FC } from 'react';
2
2
  import { Modal } from '@memori.ai/ui';
3
3
  import cx from 'classnames';
4
- import { useWidgetSurfaceEl } from '../../context/widgetSurfaceContext';
5
4
 
6
5
  export interface ContentPreviewModalProps {
7
6
  open: boolean;
@@ -26,12 +25,10 @@ const ContentPreviewModal: FC<ContentPreviewModalProps> = ({
26
25
  children,
27
26
  className,
28
27
  }) => {
29
- const surfaceEl = useWidgetSurfaceEl();
30
28
  const width = 'min(90vw, 800px)';
31
29
 
32
30
  return (
33
31
  <Modal
34
- container={surfaceEl ?? undefined}
35
32
  open={open}
36
33
  onClose={() => onClose()}
37
34
  width={width}
@@ -38,17 +38,26 @@
38
38
  text-align: left;
39
39
  }
40
40
 
41
+ .memori--date-selector__mobile-input-wrap {
42
+ position: relative;
43
+ display: flex;
44
+ width: 100%;
45
+ max-width: 100%;
46
+ align-items: center;
47
+ }
48
+
41
49
  .memori--date-selector__mobile-input {
42
50
  width: 100%;
43
51
  min-width: 0;
44
52
  max-width: 100%;
45
53
  min-height: var(--memori-spacing-3xl);
46
54
  box-sizing: border-box;
47
- padding: var(--memori-spacing-sm) var(--memori-spacing-md);
55
+ padding: var(--memori-spacing-sm) 2.75rem var(--memori-spacing-sm) var(--memori-spacing-md);
48
56
  border: 1px solid #e5e7eb;
49
57
  border-radius: var(--memori-radius-box);
50
58
  -webkit-appearance: none;
51
59
  appearance: none;
60
+ background-color: var(--memori-secondary-background, #fff);
52
61
  /* Touch-friendly */
53
62
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
54
63
  color: var(--memori-text-color);
@@ -71,11 +80,60 @@
71
80
  }
72
81
 
73
82
  .memori--date-selector__mobile-input::-webkit-calendar-picker-indicator {
74
- width: 1.25em;
75
- height: 1.25em;
83
+ position: absolute;
84
+ top: 0;
85
+ right: 0;
86
+ bottom: 0;
87
+ left: 0;
88
+ width: auto;
89
+ height: auto;
76
90
  padding: 0;
77
91
  margin: 0;
92
+ background: transparent;
78
93
  cursor: pointer;
94
+ opacity: 0;
95
+ }
96
+
97
+ /* Hide the empty native date chrome so our placeholder is readable */
98
+ .memori--date-selector__mobile-input-wrap--empty .memori--date-selector__mobile-input {
99
+ color: transparent;
100
+ }
101
+
102
+ .memori--date-selector__mobile-input-wrap--empty .memori--date-selector__mobile-input::-webkit-datetime-edit,
103
+ .memori--date-selector__mobile-input-wrap--empty .memori--date-selector__mobile-input::-webkit-datetime-edit-fields-wrapper,
104
+ .memori--date-selector__mobile-input-wrap--empty .memori--date-selector__mobile-input::-webkit-datetime-edit-text,
105
+ .memori--date-selector__mobile-input-wrap--empty .memori--date-selector__mobile-input::-webkit-datetime-edit-month-field,
106
+ .memori--date-selector__mobile-input-wrap--empty .memori--date-selector__mobile-input::-webkit-datetime-edit-day-field,
107
+ .memori--date-selector__mobile-input-wrap--empty .memori--date-selector__mobile-input::-webkit-datetime-edit-year-field,
108
+ .memori--date-selector__mobile-input-wrap--empty .memori--date-selector__mobile-input::-webkit-date-and-time-value {
109
+ color: transparent;
110
+ }
111
+
112
+ .memori--date-selector__mobile-placeholder {
113
+ position: absolute;
114
+ z-index: 1;
115
+ top: 50%;
116
+ left: var(--memori-spacing-md);
117
+ overflow: hidden;
118
+ max-width: calc(100% - 3.25rem);
119
+ color: color-mix(in srgb, var(--memori-text-color) 45%, transparent);
120
+ font-size: var(--memori-text-size-base);
121
+ line-height: 1.375;
122
+ pointer-events: none;
123
+ text-overflow: ellipsis;
124
+ transform: translateY(-50%);
125
+ white-space: nowrap;
126
+ }
127
+
128
+ .memori--date-selector__mobile-icon {
129
+ position: absolute;
130
+ z-index: 1;
131
+ top: 50%;
132
+ right: var(--memori-spacing-md);
133
+ flex-shrink: 0;
134
+ color: color-mix(in srgb, var(--memori-text-color) 55%, transparent);
135
+ pointer-events: none;
136
+ transform: translateY(-50%);
79
137
  }
80
138
 
81
139
  .memori--date-selector__mobile-input:focus {
@@ -95,6 +153,11 @@
95
153
  opacity: 0.6;
96
154
  }
97
155
 
156
+ .memori--date-selector__mobile-input-wrap:has(.memori--date-selector__mobile-input:disabled) .memori--date-selector__mobile-icon,
157
+ .memori--date-selector__mobile-input-wrap:has(.memori--date-selector__mobile-input:disabled) .memori--date-selector__mobile-placeholder {
158
+ opacity: 0.6;
159
+ }
160
+
98
161
  /* Desktop Styles */
99
162
  .memori--date-selector--desktop {
100
163
  display: flex;
@@ -110,18 +110,47 @@ describe('DateSelector', () => {
110
110
  });
111
111
 
112
112
  describe('Mobile View', () => {
113
- it('renders native date input on mobile', () => {
113
+ const originalInnerWidth = window.innerWidth;
114
+
115
+ beforeEach(() => {
116
+ Object.defineProperty(window, 'innerWidth', {
117
+ writable: true,
118
+ configurable: true,
119
+ value: 375,
120
+ });
121
+ window.dispatchEvent(new Event('resize'));
122
+ });
123
+
124
+ afterEach(() => {
125
+ Object.defineProperty(window, 'innerWidth', {
126
+ writable: true,
127
+ configurable: true,
128
+ value: originalInnerWidth,
129
+ });
130
+ window.dispatchEvent(new Event('resize'));
131
+ });
132
+
133
+ it('renders native date input on mobile', async () => {
114
134
  render(<DateSelector onChange={mockOnChange} />);
115
135
 
116
- const dateInput = screen.getByLabelText(/date/i);
136
+ const dateInput = await screen.findByLabelText(/birth date/i);
117
137
  expect(dateInput).toBeInTheDocument();
118
138
  expect(dateInput).toHaveAttribute('type', 'date');
119
139
  });
120
140
 
141
+ it('shows a placeholder hint when the date is empty', async () => {
142
+ render(<DateSelector onChange={mockOnChange} />);
143
+
144
+ await screen.findByLabelText(/birth date/i);
145
+ expect(
146
+ screen.getByText('DD/MM/YYYY')
147
+ ).toBeInTheDocument();
148
+ });
149
+
121
150
  it('calls onChange when mobile date input changes', async () => {
122
151
  render(<DateSelector onChange={mockOnChange} />);
123
152
 
124
- const dateInput = screen.getByLabelText(/date/i);
153
+ const dateInput = await screen.findByLabelText(/birth date/i);
125
154
  fireEvent.change(dateInput, { target: { value: '1995-06-15' } });
126
155
 
127
156
  await waitFor(() => {
@@ -138,7 +167,7 @@ describe('DateSelector', () => {
138
167
  it('calls onChange with undefined when mobile input is cleared', async () => {
139
168
  render(<DateSelector defaultDate="1995-06-15" onChange={mockOnChange} />);
140
169
 
141
- const dateInput = screen.getByLabelText(/date/i);
170
+ const dateInput = await screen.findByLabelText(/birth date/i);
142
171
  fireEvent.change(dateInput, { target: { value: '' } });
143
172
 
144
173
  await waitFor(() => {
@@ -1,6 +1,7 @@
1
1
  import { useEffect, useState, memo, useMemo, useRef, ChangeEvent } from 'react';
2
2
  import { DateTime } from 'luxon';
3
3
  import { useTranslation } from 'react-i18next';
4
+ import { Calendar } from 'lucide-react';
4
5
 
5
6
  export interface Props {
6
7
  defaultDate?: string | Date;
@@ -168,23 +169,48 @@ const DateSelector = memo(
168
169
  const currentDate = (day && month && year)
169
170
  ? DateTime.fromObject({ year: parseInt(year), month: parseInt(month), day: parseInt(day) })
170
171
  : null;
172
+ const dateValue =
173
+ currentDate?.isValid ? currentDate.toISODate() || '' : '';
174
+ const isEmpty = !dateValue;
175
+ const placeholder =
176
+ t('login.birthDatePlaceholder') || 'DD/MM/YYYY';
171
177
 
172
178
  return (
173
179
  <div className="memori--date-selector memori--date-selector--mobile">
174
180
  <label htmlFor="birth-date-mobile" className="memori--date-selector__mobile-label">
175
181
  {t('birthDate') || 'Birth Date'}:
176
182
  </label>
177
- <input
178
- id="birth-date-mobile"
179
- type="date"
180
- className="memori--date-selector__mobile-input"
181
- value={currentDate?.isValid ? currentDate.toISODate() || '' : ''}
182
- onChange={handleMobileChange}
183
- disabled={disabled}
184
- min={minDate.toISODate() || '1900-01-01'}
185
- max={maxDate.toISODate() || ''}
186
- aria-label={String(t('dateOfBirth') || t('date'))}
187
- />
183
+ <div
184
+ className={`memori--date-selector__mobile-input-wrap${
185
+ isEmpty ? ' memori--date-selector__mobile-input-wrap--empty' : ''
186
+ }`}
187
+ >
188
+ <input
189
+ id="birth-date-mobile"
190
+ type="date"
191
+ className="memori--date-selector__mobile-input"
192
+ value={dateValue}
193
+ onChange={handleMobileChange}
194
+ disabled={disabled}
195
+ min={minDate.toISODate() || '1900-01-01'}
196
+ max={maxDate.toISODate() || ''}
197
+ aria-label={String(t('birthDate') || t('date'))}
198
+ />
199
+ {isEmpty && (
200
+ <span
201
+ className="memori--date-selector__mobile-placeholder"
202
+ aria-hidden
203
+ >
204
+ {placeholder}
205
+ </span>
206
+ )}
207
+ <Calendar
208
+ className="memori--date-selector__mobile-icon"
209
+ aria-hidden
210
+ size={20}
211
+ strokeWidth={1.75}
212
+ />
213
+ </div>
188
214
  </div>
189
215
  );
190
216
  }
@@ -3,7 +3,6 @@ import {
3
3
  Tenant,
4
4
  } from '@memori.ai/memori-api-client/dist/types';
5
5
  import { Drawer } from '@memori.ai/ui';
6
- import { useWidgetSurfaceEl } from '../../context/widgetSurfaceContext';
7
6
  import { useTranslation } from 'react-i18next';
8
7
  import { getResourceUrl } from '../../helpers/media';
9
8
 
@@ -25,11 +24,9 @@ const ExpertsDrawer = ({
25
24
  onClose,
26
25
  }: Props) => {
27
26
  const { t } = useTranslation();
28
- const surfaceEl = useWidgetSurfaceEl();
29
27
 
30
28
  return (
31
29
  <Drawer
32
- container={surfaceEl ?? undefined}
33
30
  open={open}
34
31
  onClose={onClose}
35
32
  className="memori--experts-drawer"
@@ -22,6 +22,7 @@ exports[`renders FeedbackButtons unchanged 1`] = `
22
22
  class="memori-button__icon"
23
23
  >
24
24
  <svg
25
+ aria-hidden="true"
25
26
  class="lucide lucide-message-square"
26
27
  fill="none"
27
28
  height="24"
@@ -34,7 +35,7 @@ exports[`renders FeedbackButtons unchanged 1`] = `
34
35
  xmlns="http://www.w3.org/2000/svg"
35
36
  >
36
37
  <path
37
- d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"
38
+ d="M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"
38
39
  />
39
40
  </svg>
40
41
  </span>