@memori.ai/memori-react 9.0.0-alpha.5 → 9.0.0-alpha.7

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 (286) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +8 -3
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  4. package/dist/components/Auth/Auth.js +3 -1
  5. package/dist/components/Auth/Auth.js.map +1 -1
  6. package/dist/components/Avatar/Avatar.js +5 -10
  7. package/dist/components/Avatar/Avatar.js.map +1 -1
  8. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +8 -1
  9. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  10. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +1 -1
  11. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
  12. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -0
  13. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js +14 -5
  14. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  15. package/dist/components/Chat/Chat.js +3 -1
  16. package/dist/components/Chat/Chat.js.map +1 -1
  17. package/dist/components/ChatBubble/ChatBubble.js +21 -15
  18. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  19. package/dist/components/ChatHistoryDrawer/ChatHistory.js +3 -1
  20. package/dist/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  21. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js +6 -3
  22. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  23. package/dist/components/ContentPreviewModal/ContentPreviewModal.js +3 -1
  24. package/dist/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  25. package/dist/components/DateSelector/DateSelector.d.ts +2 -1
  26. package/dist/components/DateSelector/DateSelector.js +17 -7
  27. package/dist/components/DateSelector/DateSelector.js.map +1 -1
  28. package/dist/components/ExpertsDrawer/ExpertsDrawer.js +3 -1
  29. package/dist/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
  30. package/dist/components/FilePreview/FilePreview.js +22 -5
  31. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  32. package/dist/components/KnownFacts/KnownFacts.js +5 -3
  33. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  34. package/dist/components/LoginDrawer/LoginDrawer.js +3 -1
  35. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  36. package/dist/components/MediaWidget/MediaItemWidget.js +14 -12
  37. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  38. package/dist/components/MediaWidget/MediaItemWidget.utils.d.ts +3 -2
  39. package/dist/components/MediaWidget/MediaItemWidget.utils.js +28 -6
  40. package/dist/components/MediaWidget/MediaItemWidget.utils.js.map +1 -1
  41. package/dist/components/MediaWidget/MediaPreviewModal.js +6 -7
  42. package/dist/components/MediaWidget/MediaPreviewModal.js.map +1 -1
  43. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +19 -5
  44. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +4 -1
  45. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  46. package/dist/components/MemoriWidget/MemoriWidget.css +4 -2
  47. package/dist/components/MemoriWidget/MemoriWidget.js +760 -404
  48. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  49. package/dist/components/SettingsDrawer/SettingsDrawer.js +3 -1
  50. package/dist/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  51. package/dist/components/StartPanel/StartPanel.js +3 -1
  52. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  53. package/dist/components/UploadButton/UploadButton.js +21 -5
  54. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  55. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +126 -60
  56. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  57. package/dist/components/UploadButton/UploadImages/UploadImages.js +3 -1
  58. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  59. package/dist/components/WhyThisAnswer/WhyThisAnswer.js +3 -1
  60. package/dist/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  61. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js +3 -1
  62. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  63. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +21 -1
  64. package/dist/components/layouts/chat.css +2 -1
  65. package/dist/components/layouts/fullpage.css +31 -8
  66. package/dist/components/layouts/hidden-chat.css +1 -0
  67. package/dist/components/layouts/totem.css +2 -1
  68. package/dist/components/layouts/zoomed-full-body.css +32 -7
  69. package/dist/context/widgetSurfaceContext.d.ts +3 -0
  70. package/dist/context/widgetSurfaceContext.js +11 -0
  71. package/dist/context/widgetSurfaceContext.js.map +1 -0
  72. package/dist/helpers/constants.d.ts +3 -0
  73. package/dist/helpers/constants.js +27 -1
  74. package/dist/helpers/constants.js.map +1 -1
  75. package/dist/helpers/credits.d.ts +5 -2
  76. package/dist/helpers/credits.js +5 -1
  77. package/dist/helpers/credits.js.map +1 -1
  78. package/dist/helpers/message.d.ts +1 -1
  79. package/dist/helpers/message.js +4 -4
  80. package/dist/helpers/message.js.map +1 -1
  81. package/dist/helpers/nats/getNatsConfig.d.ts +9 -0
  82. package/dist/helpers/nats/getNatsConfig.js +65 -0
  83. package/dist/helpers/nats/getNatsConfig.js.map +1 -0
  84. package/dist/helpers/nats/isSessionExpiredError.d.ts +3 -0
  85. package/dist/helpers/nats/isSessionExpiredError.js +36 -0
  86. package/dist/helpers/nats/isSessionExpiredError.js.map +1 -0
  87. package/dist/helpers/nats/useNats.d.ts +12 -0
  88. package/dist/helpers/nats/useNats.js +75 -0
  89. package/dist/helpers/nats/useNats.js.map +1 -0
  90. package/dist/helpers/nats/useNatsSession.d.ts +28 -0
  91. package/dist/helpers/nats/useNatsSession.js +212 -0
  92. package/dist/helpers/nats/useNatsSession.js.map +1 -0
  93. package/dist/helpers/utils.d.ts +21 -0
  94. package/dist/helpers/utils.js +75 -4
  95. package/dist/helpers/utils.js.map +1 -1
  96. package/dist/locales/de.json +1 -0
  97. package/dist/locales/en.json +1 -0
  98. package/dist/locales/es.json +1 -0
  99. package/dist/locales/fr.json +1 -0
  100. package/dist/locales/it.json +1 -0
  101. package/dist/styles.css +1 -1
  102. package/dist/types/integration.d.ts +3 -0
  103. package/dist/types/integration.js +16 -0
  104. package/dist/types/integration.js.map +1 -0
  105. package/dist/version.d.ts +1 -1
  106. package/dist/version.js +1 -1
  107. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +8 -3
  108. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  109. package/esm/components/Auth/Auth.js +3 -1
  110. package/esm/components/Auth/Auth.js.map +1 -1
  111. package/esm/components/Avatar/Avatar.js +5 -10
  112. package/esm/components/Avatar/Avatar.js.map +1 -1
  113. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +9 -2
  114. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  115. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +2 -2
  116. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
  117. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -0
  118. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js +13 -4
  119. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  120. package/esm/components/Chat/Chat.js +3 -1
  121. package/esm/components/Chat/Chat.js.map +1 -1
  122. package/esm/components/ChatBubble/ChatBubble.js +21 -15
  123. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  124. package/esm/components/ChatHistoryDrawer/ChatHistory.js +3 -1
  125. package/esm/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  126. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js +6 -3
  127. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  128. package/esm/components/ContentPreviewModal/ContentPreviewModal.js +3 -1
  129. package/esm/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  130. package/esm/components/DateSelector/DateSelector.d.ts +2 -1
  131. package/esm/components/DateSelector/DateSelector.js +17 -7
  132. package/esm/components/DateSelector/DateSelector.js.map +1 -1
  133. package/esm/components/ExpertsDrawer/ExpertsDrawer.js +3 -1
  134. package/esm/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
  135. package/esm/components/FilePreview/FilePreview.js +24 -7
  136. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  137. package/esm/components/KnownFacts/KnownFacts.js +5 -3
  138. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  139. package/esm/components/LoginDrawer/LoginDrawer.js +3 -1
  140. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  141. package/esm/components/MediaWidget/MediaItemWidget.js +16 -14
  142. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  143. package/esm/components/MediaWidget/MediaItemWidget.utils.d.ts +3 -2
  144. package/esm/components/MediaWidget/MediaItemWidget.utils.js +27 -6
  145. package/esm/components/MediaWidget/MediaItemWidget.utils.js.map +1 -1
  146. package/esm/components/MediaWidget/MediaPreviewModal.js +6 -7
  147. package/esm/components/MediaWidget/MediaPreviewModal.js.map +1 -1
  148. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +19 -5
  149. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +4 -1
  150. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  151. package/esm/components/MemoriWidget/MemoriWidget.css +4 -2
  152. package/esm/components/MemoriWidget/MemoriWidget.js +760 -404
  153. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  154. package/esm/components/SettingsDrawer/SettingsDrawer.js +3 -1
  155. package/esm/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  156. package/esm/components/StartPanel/StartPanel.js +3 -1
  157. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  158. package/esm/components/UploadButton/UploadButton.js +21 -5
  159. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  160. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +126 -60
  161. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  162. package/esm/components/UploadButton/UploadImages/UploadImages.js +3 -1
  163. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  164. package/esm/components/WhyThisAnswer/WhyThisAnswer.js +3 -1
  165. package/esm/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  166. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js +3 -1
  167. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  168. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +21 -1
  169. package/esm/components/layouts/chat.css +2 -1
  170. package/esm/components/layouts/fullpage.css +31 -8
  171. package/esm/components/layouts/hidden-chat.css +1 -0
  172. package/esm/components/layouts/totem.css +2 -1
  173. package/esm/components/layouts/zoomed-full-body.css +32 -7
  174. package/esm/context/widgetSurfaceContext.d.ts +3 -0
  175. package/esm/context/widgetSurfaceContext.js +7 -0
  176. package/esm/context/widgetSurfaceContext.js.map +1 -0
  177. package/esm/helpers/constants.d.ts +3 -0
  178. package/esm/helpers/constants.js +26 -0
  179. package/esm/helpers/constants.js.map +1 -1
  180. package/esm/helpers/credits.d.ts +5 -2
  181. package/esm/helpers/credits.js +5 -1
  182. package/esm/helpers/credits.js.map +1 -1
  183. package/esm/helpers/message.d.ts +1 -1
  184. package/esm/helpers/message.js +2 -2
  185. package/esm/helpers/message.js.map +1 -1
  186. package/esm/helpers/nats/getNatsConfig.d.ts +9 -0
  187. package/esm/helpers/nats/getNatsConfig.js +61 -0
  188. package/esm/helpers/nats/getNatsConfig.js.map +1 -0
  189. package/esm/helpers/nats/isSessionExpiredError.d.ts +3 -0
  190. package/esm/helpers/nats/isSessionExpiredError.js +32 -0
  191. package/esm/helpers/nats/isSessionExpiredError.js.map +1 -0
  192. package/esm/helpers/nats/useNats.d.ts +12 -0
  193. package/esm/helpers/nats/useNats.js +72 -0
  194. package/esm/helpers/nats/useNats.js.map +1 -0
  195. package/esm/helpers/nats/useNatsSession.d.ts +28 -0
  196. package/esm/helpers/nats/useNatsSession.js +208 -0
  197. package/esm/helpers/nats/useNatsSession.js.map +1 -0
  198. package/esm/helpers/utils.d.ts +21 -0
  199. package/esm/helpers/utils.js +68 -3
  200. package/esm/helpers/utils.js.map +1 -1
  201. package/esm/locales/de.json +1 -0
  202. package/esm/locales/en.json +1 -0
  203. package/esm/locales/es.json +1 -0
  204. package/esm/locales/fr.json +1 -0
  205. package/esm/locales/it.json +1 -0
  206. package/esm/styles.css +1 -1
  207. package/esm/types/integration.d.ts +3 -0
  208. package/esm/types/integration.js +11 -0
  209. package/esm/types/integration.js.map +1 -0
  210. package/esm/version.d.ts +1 -1
  211. package/esm/version.js +1 -1
  212. package/package.json +5 -3
  213. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +9 -1
  214. package/src/components/Auth/Auth.tsx +3 -0
  215. package/src/components/Avatar/Avatar.stories.tsx +45 -28
  216. package/src/components/Avatar/Avatar.test.tsx +54 -0
  217. package/src/components/Avatar/Avatar.tsx +8 -12
  218. package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx +12 -5
  219. package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.ts +2 -1
  220. package/src/components/Avatar/AvatarView/AvatarComponent/constants.ts +16 -4
  221. package/src/components/Avatar/__snapshots__/Avatar.test.tsx.snap +164 -0
  222. package/src/components/Chat/Chat.tsx +3 -0
  223. package/src/components/ChatBubble/ChatBubble.tsx +40 -12
  224. package/src/components/ChatHistoryDrawer/ChatHistory.tsx +3 -0
  225. package/src/components/CompletionProviderStatus/CompletionProviderStatus.tsx +8 -4
  226. package/src/components/ContentPreviewModal/ContentPreviewModal.tsx +3 -0
  227. package/src/components/DateSelector/DateSelector.stories.tsx +11 -2
  228. package/src/components/DateSelector/DateSelector.tsx +28 -9
  229. package/src/components/ExpertsDrawer/ExpertsDrawer.tsx +3 -0
  230. package/src/components/FilePreview/FilePreview.tsx +28 -7
  231. package/src/components/KnownFacts/KnownFacts.tsx +5 -0
  232. package/src/components/LoginDrawer/LoginDrawer.tsx +3 -0
  233. package/src/components/MediaWidget/MediaItemWidget.tsx +26 -13
  234. package/src/components/MediaWidget/MediaItemWidget.utils.test.ts +45 -2
  235. package/src/components/MediaWidget/MediaItemWidget.utils.ts +39 -6
  236. package/src/components/MediaWidget/MediaPreviewModal.tsx +9 -7
  237. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +19 -5
  238. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +4 -0
  239. package/src/components/MemoriWidget/MemoriWidget.css +4 -2
  240. package/src/components/MemoriWidget/MemoriWidget.tsx +818 -349
  241. package/src/components/SettingsDrawer/SettingsDrawer.tsx +3 -0
  242. package/src/components/StartPanel/StartPanel.stories.tsx +22 -0
  243. package/src/components/StartPanel/StartPanel.test.tsx +64 -1
  244. package/src/components/StartPanel/StartPanel.tsx +3 -0
  245. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +261 -0
  246. package/src/components/UploadButton/UploadButton.tsx +30 -11
  247. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +151 -61
  248. package/src/components/UploadButton/UploadImages/UploadImages.tsx +3 -0
  249. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +2 -2
  250. package/src/components/WhyThisAnswer/WhyThisAnswer.tsx +3 -0
  251. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.tsx +4 -0
  252. package/src/components/layouts/WebsiteAssistant/__snapshots__/WebsiteAssistant.test.tsx.snap +48 -44
  253. package/src/components/layouts/WebsiteAssistant/website-assistant.css +21 -1
  254. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +533 -529
  255. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +1058 -1050
  256. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +443 -439
  257. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +584 -580
  258. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +528 -524
  259. package/src/components/layouts/chat.css +2 -1
  260. package/src/components/layouts/fullpage.css +31 -8
  261. package/src/components/layouts/hidden-chat.css +1 -0
  262. package/src/components/layouts/layouts.stories.tsx +131 -12
  263. package/src/components/layouts/totem.css +2 -1
  264. package/src/components/layouts/zoomed-full-body.css +32 -7
  265. package/src/context/widgetSurfaceContext.tsx +14 -0
  266. package/src/helpers/constants.ts +32 -1
  267. package/src/helpers/credits.ts +16 -1
  268. package/src/helpers/message.test.ts +28 -1
  269. package/src/helpers/message.ts +4 -4
  270. package/src/helpers/nats/getNatsConfig.ts +145 -0
  271. package/src/helpers/nats/isSessionExpiredError.test.ts +38 -0
  272. package/src/helpers/nats/isSessionExpiredError.ts +51 -0
  273. package/src/helpers/nats/useNats.ts +124 -0
  274. package/src/helpers/nats/useNatsSession.ts +394 -0
  275. package/src/helpers/utils.test.ts +162 -0
  276. package/src/helpers/utils.ts +108 -3
  277. package/src/index.stories.tsx +32 -0
  278. package/src/locales/de.json +1 -0
  279. package/src/locales/en.json +1 -0
  280. package/src/locales/es.json +1 -0
  281. package/src/locales/fr.json +1 -0
  282. package/src/locales/it.json +1 -0
  283. package/src/styles.css +61 -1
  284. package/src/types/integration.test.ts +32 -0
  285. package/src/types/integration.ts +31 -0
  286. package/src/version.ts +1 -1
@@ -5,6 +5,9 @@ import { FileText as DocumentIcon } from 'lucide-react';
5
5
  import { Modal } from '@memori.ai/ui';
6
6
  import { useTranslation } from 'react-i18next';
7
7
  import memoriApiClient from '@memori.ai/memori-api-client';
8
+ import { officeNativeExtensions } from '../../../helpers/constants';
9
+ import { isOfficeNativeFilename } from '../../../helpers/utils';
10
+ import { useWidgetSurfaceEl } from '../../../context/widgetSurfaceContext';
8
11
  // Types
9
12
  type PreviewFile = {
10
13
  name: string;
@@ -78,6 +81,7 @@ const UploadDocuments: React.FC<UploadDocumentsProps> = ({
78
81
  onValidatePayloadSize,
79
82
  }) => {
80
83
  const { t } = useTranslation();
84
+ const surfaceEl = useWidgetSurfaceEl();
81
85
  const { backend } = client || {
82
86
  backend: { uploadAsset: null, uploadAssetUnlogged: null },
83
87
  };
@@ -165,64 +169,101 @@ const UploadDocuments: React.FC<UploadDocumentsProps> = ({
165
169
  }
166
170
  };
167
171
 
168
- const extractTextFromXLSX = async (file: File): Promise<string> => {
169
- try {
170
- if (!window.XLSX) {
171
- await new Promise((resolve, reject) => {
172
- const script = document.createElement('script');
173
- script.src = XLSX_URL;
174
- script.onload = resolve;
175
- script.onerror = reject;
176
- document.head.appendChild(script);
177
- });
178
- }
172
+ const loadXLSXLibrary = async (): Promise<void> => {
173
+ if (window.XLSX) return;
179
174
 
180
- const arrayBuffer = await file.arrayBuffer();
181
- const workbook = window.XLSX.read(arrayBuffer, {
182
- type: 'array',
183
- cellFormula: true,
184
- cellNF: true,
185
- cellText: true,
186
- cellDates: true,
175
+ await new Promise((resolve, reject) => {
176
+ const script = document.createElement('script');
177
+ script.src = XLSX_URL;
178
+ script.onload = resolve;
179
+ script.onerror = reject;
180
+ document.head.appendChild(script);
181
+ });
182
+ };
183
+
184
+ const readXLSXWorkbook = async (file: File) => {
185
+ await loadXLSXLibrary();
186
+
187
+ const arrayBuffer = await file.arrayBuffer();
188
+ return window.XLSX.read(arrayBuffer, {
189
+ type: 'array',
190
+ cellFormula: true,
191
+ cellNF: true,
192
+ cellText: true,
193
+ cellDates: true,
194
+ });
195
+ };
196
+
197
+ const formatXLSXWorkbookForDisplay = (workbook: {
198
+ SheetNames: string[];
199
+ Sheets: Record<string, unknown>;
200
+ }): string => {
201
+ let text = '';
202
+
203
+ for (const sheetName of workbook.SheetNames) {
204
+ const worksheet = workbook.Sheets[sheetName];
205
+ const data = window.XLSX.utils.sheet_to_json(worksheet, {
206
+ header: 1,
207
+ raw: false,
187
208
  });
188
209
 
189
- let text = '';
190
- for (const sheetName of workbook.SheetNames) {
191
- const worksheet = workbook.Sheets[sheetName];
192
- const data = window.XLSX.utils.sheet_to_json(worksheet, {
193
- header: 1,
194
- raw: false,
210
+ const colWidths = data.reduce((widths: number[], row: any[]) => {
211
+ row.forEach((cell, i) => {
212
+ const cellWidth = (cell || '').toString().length;
213
+ widths[i] = Math.max(widths[i] || 0, cellWidth);
195
214
  });
215
+ return widths;
216
+ }, []);
217
+
218
+ const formattedText = data.map((row: any[]) => {
219
+ return row
220
+ .map((cell, i) => {
221
+ const cellStr = (cell || '').toString();
222
+ return cellStr.padEnd(colWidths[i] + 2);
223
+ })
224
+ .join('|')
225
+ .trim();
226
+ });
196
227
 
197
- const colWidths = data.reduce((widths: number[], row: any[]) => {
198
- row.forEach((cell, i) => {
199
- const cellWidth = (cell || '').toString().length;
200
- widths[i] = Math.max(widths[i] || 0, cellWidth);
201
- });
202
- return widths;
203
- }, []);
204
-
205
- const formattedText = data.map((row: any[]) => {
206
- return row
207
- .map((cell, i) => {
208
- const cellStr = (cell || '').toString();
209
- return cellStr.padEnd(colWidths[i] + 2);
210
- })
211
- .join('|')
212
- .trim();
213
- });
228
+ if (formattedText.length > 0) {
229
+ const separator = colWidths
230
+ .map((w: number) => '-'.repeat(w + 2))
231
+ .join('+');
232
+ formattedText.splice(1, 0, separator);
233
+ }
214
234
 
215
- if (formattedText.length > 0) {
216
- const separator = colWidths
217
- .map((w: number) => '-'.repeat(w + 2))
218
- .join('+');
219
- formattedText.splice(1, 0, separator);
220
- }
235
+ text += `Sheet: ${sheetName}\n${formattedText.join('\n')}\n\n`;
236
+ }
237
+
238
+ return text;
239
+ };
221
240
 
222
- text += `Sheet: ${sheetName}\n${formattedText.join('\n')}\n\n`;
241
+ const formatXLSXWorkbookAsCsv = (workbook: {
242
+ SheetNames: string[];
243
+ Sheets: Record<string, unknown>;
244
+ }): string => {
245
+ let text = '';
246
+
247
+ for (const sheetName of workbook.SheetNames) {
248
+ const worksheet = workbook.Sheets[sheetName];
249
+ const csv = window.XLSX.utils.sheet_to_csv(worksheet, { raw: false });
250
+ if (csv.trim()) {
251
+ text += `Sheet: ${sheetName}\n${csv}\n\n`;
223
252
  }
253
+ }
224
254
 
225
- return text;
255
+ return text;
256
+ };
257
+
258
+ const extractTextFromXLSX = async (
259
+ file: File
260
+ ): Promise<{ display: string; asset: string }> => {
261
+ try {
262
+ const workbook = await readXLSXWorkbook(file);
263
+ return {
264
+ display: formatXLSXWorkbookForDisplay(workbook),
265
+ asset: formatXLSXWorkbookAsCsv(workbook),
266
+ };
226
267
  } catch (error) {
227
268
  console.error('XLSX extraction failed:', error);
228
269
  throw new Error(
@@ -235,21 +276,31 @@ const UploadDocuments: React.FC<UploadDocumentsProps> = ({
235
276
 
236
277
  const processDocumentFile = async (
237
278
  file: File
238
- ): Promise<{ text: string | null }> => {
239
- const fileExt = file.name.split('.').pop()?.toLowerCase() || '';
279
+ ): Promise<{
280
+ text: string | null;
281
+ textForAsset?: string;
282
+ uploadAsOriginal?: boolean;
283
+ }> => {
284
+ if (isOfficeNativeFilename(file.name)) {
285
+ return { text: null, uploadAsOriginal: true };
286
+ }
240
287
 
288
+ const ext = file.name.split('.').pop()?.toLowerCase() || '';
241
289
  try {
242
290
  let text: string | null = null;
291
+ let textForAsset: string | undefined;
243
292
 
244
- if (fileExt === 'pdf') {
293
+ if (ext === 'pdf') {
245
294
  text = await extractTextFromPDF(file);
246
- } else if (['txt', 'md', 'json', 'csv', 'html'].includes(fileExt)) {
295
+ } else if (['txt', 'md', 'json', 'csv', 'html'].includes(ext)) {
247
296
  text = await file.text();
248
- } else if (fileExt === 'xlsx') {
249
- text = await extractTextFromXLSX(file);
297
+ } else if (ext === 'xlsx') {
298
+ const extracted = await extractTextFromXLSX(file);
299
+ text = extracted.display;
300
+ textForAsset = extracted.asset;
250
301
  }
251
302
 
252
- return { text };
303
+ return { text, textForAsset };
253
304
  } catch (error) {
254
305
  console.error('Document processing failed:', error);
255
306
  throw new Error(
@@ -295,7 +346,12 @@ const UploadDocuments: React.FC<UploadDocumentsProps> = ({
295
346
  throw new Error(response.resultMessage || 'Upload failed');
296
347
  }
297
348
 
298
- return response.asset?.assetURL;
349
+ const assetURL = response.asset?.assetURL;
350
+ if (!assetURL) {
351
+ throw new Error('Upload failed: missing asset URL');
352
+ }
353
+
354
+ return assetURL;
299
355
  };
300
356
 
301
357
  const handleDocumentUpload = async (
@@ -360,11 +416,42 @@ const UploadDocuments: React.FC<UploadDocumentsProps> = ({
360
416
  const fileId = Math.random().toString(36).substr(2, 9);
361
417
 
362
418
  try {
363
- const { text } = await processDocumentFile(file);
419
+ const { text, textForAsset, uploadAsOriginal } =
420
+ await processDocumentFile(file);
421
+
422
+ if (uploadAsOriginal) {
423
+ // Office native format: upload the original file as asset, no text extraction
424
+ let assetUrl: string | undefined;
425
+ try {
426
+ assetUrl = await uploadAssetFile(file);
427
+ } catch (uploadError) {
428
+ console.error('Office asset upload failed:', uploadError);
429
+ onDocumentError?.({
430
+ message: t('upload.officeAssetUploadFailed', {
431
+ fileName: file.name,
432
+ defaultValue: `"${file.name}" could not be uploaded and was not added.`,
433
+ }),
434
+ severity: 'error',
435
+ });
436
+ }
437
+
438
+ if (!assetUrl) {
439
+ activeCount--;
440
+ onLoadingChange?.(true, activeCount);
441
+ continue;
442
+ }
364
443
 
365
- if (text) {
444
+ processedFiles.push({
445
+ name: file.name,
446
+ id: fileId,
447
+ content: '',
448
+ mimeType: file.type,
449
+ textAssetUrl: assetUrl,
450
+ });
451
+ } else if (text) {
366
452
  const baseName = file.name.replace(/\.[^/.]+$/, '') || file.name;
367
- const textFile = new File([text], `${baseName}.txt`, {
453
+ const assetText = textForAsset ?? text;
454
+ const textFile = new File([assetText], `${baseName}.txt`, {
368
455
  type: 'text/plain',
369
456
  });
370
457
 
@@ -429,7 +516,9 @@ const UploadDocuments: React.FC<UploadDocumentsProps> = ({
429
516
  <input
430
517
  ref={documentInputRef}
431
518
  type="file"
432
- accept=".pdf,.txt,.md,.json,.xlsx,.csv,.html"
519
+ accept={`.pdf,.txt,.md,.json,.xlsx,.csv,.html,${officeNativeExtensions.join(
520
+ ','
521
+ )}`}
433
522
  multiple
434
523
  className="memori--upload-file-input"
435
524
  onChange={handleDocumentUpload}
@@ -468,6 +557,7 @@ const UploadDocuments: React.FC<UploadDocumentsProps> = ({
468
557
 
469
558
  {/* Modal */}
470
559
  <Modal
560
+ container={surfaceEl ?? undefined}
471
561
  width="80%"
472
562
  widthMd="80%"
473
563
  open={!!selectedFile}
@@ -8,6 +8,7 @@ import { Asset, Medium } from '@memori.ai/memori-api-client/dist/types';
8
8
  import { useTranslation } from 'react-i18next';
9
9
  import { Button } from '@memori.ai/ui';
10
10
  import { compressImage } from '../../../helpers/imageCompression';
11
+ import { useWidgetSurfaceEl } from '../../../context/widgetSurfaceContext';
11
12
 
12
13
  // Types
13
14
  type PreviewFile = {
@@ -54,6 +55,7 @@ const UploadImages: React.FC<UploadImagesProps> = ({
54
55
  onValidateImageFile,
55
56
  }) => {
56
57
  const { t, i18n } = useTranslation();
58
+ const surfaceEl = useWidgetSurfaceEl();
57
59
  // Client
58
60
  const { backend, dialog } = client || {
59
61
  backend: { uploadAsset: null, uploadAssetUnlogged: null },
@@ -483,6 +485,7 @@ const UploadImages: React.FC<UploadImagesProps> = ({
483
485
 
484
486
  {/* Upload Modal with Title Input */}
485
487
  <Modal
488
+ container={surfaceEl ?? undefined}
486
489
  open={showUploadModal && !!selectedFile}
487
490
  className="memori--modal-preview-file memori--upload-image-preview-modal"
488
491
  onClose={handleCancelUpload}
@@ -6,7 +6,7 @@ exports[`renders UploadButton unchanged 1`] = `
6
6
  class="memori--unified-upload-wrapper"
7
7
  >
8
8
  <input
9
- accept=".jpg,.jpeg,.png,.pdf,.txt,.json,.xlsx,.csv,.md,.html"
9
+ accept=".jpg,.jpeg,.png,.pdf,.txt,.json,.xlsx,.csv,.md,.html,.doc,.docx,.dotx,.xltx,.potx"
10
10
  class="memori--upload-file-input"
11
11
  multiple=""
12
12
  style="display: none;"
@@ -60,7 +60,7 @@ exports[`renders UploadButton unchanged 1`] = `
60
60
  class="memori--document-upload-wrapper"
61
61
  >
62
62
  <input
63
- accept=".pdf,.txt,.md,.json,.xlsx,.csv,.html"
63
+ accept=".pdf,.txt,.md,.json,.xlsx,.csv,.html,.doc,.docx,.dotx,.xltx,.potx"
64
64
  class="memori--upload-file-input"
65
65
  multiple=""
66
66
  type="file"
@@ -13,6 +13,7 @@ import {
13
13
  } from '@memori.ai/ui';
14
14
  import { getErrori18nKey } from '../../helpers/error';
15
15
  import { useTranslation } from 'react-i18next';
16
+ import { useWidgetSurfaceEl } from '../../context/widgetSurfaceContext';
16
17
  import Snippet from '../Snippet/Snippet';
17
18
  import MediaWidget from '../MediaWidget/MediaWidget';
18
19
  import { Card } from '@memori.ai/ui';
@@ -40,6 +41,7 @@ const WhyThisAnswer = ({
40
41
  client,
41
42
  _TEST_loading = false,
42
43
  }: Props) => {
44
+ const surfaceEl = useWidgetSurfaceEl();
43
45
  const { t } = useTranslation();
44
46
  const { add } = useAlertManager();
45
47
  const searchMemory = client?.search.searchMemory;
@@ -97,6 +99,7 @@ const WhyThisAnswer = ({
97
99
 
98
100
  return (
99
101
  <Drawer
102
+ container={surfaceEl ?? undefined}
100
103
  open={visible}
101
104
  anchor="right"
102
105
  className="memori-whythisanswer-drawer"
@@ -62,6 +62,10 @@ const WebsiteAssistantLayout: React.FC<LayoutProps> = ({
62
62
  <div
63
63
  className={`memori-website_assistant--${
64
64
  collapsed ? 'collapsed' : 'expanded'
65
+ }${
66
+ useSideArtifactChrome
67
+ ? ' memori-website_assistant--artifact-open'
68
+ : ''
65
69
  }`}
66
70
  >
67
71
  {!collapsed && (
@@ -12,56 +12,60 @@ exports[`renders WEBSITE_ASSISTANT layout unchanged 1`] = `
12
12
  style="height: 100vh;"
13
13
  >
14
14
  <div
15
- class="memori-website_assistant--trigger"
15
+ class="memori-widget__surface"
16
16
  >
17
- <button
18
- aria-expanded="false"
19
- aria-label="expand"
20
- class="memori-button memori-button--ghost memori-button--md memori-button--circle memori-website_assistant--trigger-button"
21
- tabindex="0"
22
- title="expand"
23
- type="button"
17
+ <div
18
+ class="memori-website_assistant--trigger"
24
19
  >
25
- <span
26
- class="memori-button__content"
20
+ <button
21
+ aria-expanded="false"
22
+ aria-label="expand"
23
+ class="memori-button memori-button--ghost memori-button--md memori-button--circle memori-website_assistant--trigger-button"
24
+ tabindex="0"
25
+ title="expand"
26
+ type="button"
27
27
  >
28
- <div
29
- class="memori-blob"
28
+ <span
29
+ class="memori-button__content"
30
30
  >
31
- <figure>
32
- <img
33
- alt=""
34
- role="presentation"
35
- src="https://aisuru.com/images/aisuru/square_logo.png"
36
- />
37
- </figure>
38
- <div
39
- class="mainDiv"
40
- />
41
- <div
42
- class="mainDiv"
43
- />
44
31
  <div
45
- class="mainDiv"
46
- />
47
- <div
48
- class="mainDiv"
49
- />
50
- <div
51
- class="mainDiv"
52
- />
53
- </div>
54
- </span>
55
- </button>
32
+ class="memori-blob"
33
+ >
34
+ <figure>
35
+ <img
36
+ alt=""
37
+ role="presentation"
38
+ src="https://aisuru.com/images/aisuru/square_logo.png"
39
+ />
40
+ </figure>
41
+ <div
42
+ class="mainDiv"
43
+ />
44
+ <div
45
+ class="mainDiv"
46
+ />
47
+ <div
48
+ class="mainDiv"
49
+ />
50
+ <div
51
+ class="mainDiv"
52
+ />
53
+ <div
54
+ class="mainDiv"
55
+ />
56
+ </div>
57
+ </span>
58
+ </button>
59
+ </div>
60
+ <div
61
+ class="memori-website_assistant--collapsed"
62
+ />
63
+ <audio
64
+ id="memori-audio"
65
+ src="https://aisuru.com/intro.mp3"
66
+ style="display: none;"
67
+ />
56
68
  </div>
57
- <div
58
- class="memori-website_assistant--collapsed"
59
- />
60
- <audio
61
- id="memori-audio"
62
- src="https://aisuru.com/intro.mp3"
63
- style="display: none;"
64
- />
65
69
  </div>
66
70
  <div
67
71
  aria-atomic="false"
@@ -195,6 +195,15 @@
195
195
  pointer-events: all;
196
196
  }
197
197
 
198
+ /*
199
+ * Keep in sync with ArtifactDrawer split width (46% / --memori-modal-size-md override).
200
+ * Same pairing as HiddenChat's `.memori-sidebar-toggle-artifact` → `right: 46%`.
201
+ */
202
+ .memori-widget.memori-layout-website_assistant
203
+ .memori-website_assistant--expanded.memori-website_assistant--artifact-open {
204
+ right: 46%;
205
+ }
206
+
198
207
  /* Tablet */
199
208
  @media (min-width: 601px) {
200
209
  .memori-widget.memori-layout-website_assistant .memori-website_assistant--collapsed,
@@ -205,6 +214,11 @@
205
214
  border-radius: var(--memori-radius-box) 0 0 0;
206
215
  }
207
216
 
217
+ .memori-widget.memori-layout-website_assistant
218
+ .memori-website_assistant--expanded.memori-website_assistant--artifact-open {
219
+ right: 46%;
220
+ }
221
+
208
222
  .memori-widget.memori-layout-website_assistant .memori-website_assistant--expanded {
209
223
  height: min(75vh, calc(100vh - var(--memori-spacing-5xl)));
210
224
  }
@@ -218,6 +232,11 @@
218
232
  border-radius: var(--memori-radius-box) 0 0 0;
219
233
  }
220
234
 
235
+ .memori-widget.memori-layout-website_assistant
236
+ .memori-website_assistant--expanded.memori-website_assistant--artifact-open {
237
+ right: 46%;
238
+ }
239
+
221
240
  .memori-widget.memori-layout-website_assistant .memori-website_assistant--expanded {
222
241
  height: 100vh;
223
242
  border-radius: 0;
@@ -418,7 +437,8 @@
418
437
  transform: none !important;
419
438
  }
420
439
 
421
- .memori-layout-website_assistant.memori--avatar-readyplayerme-full .memori--avatar-wrapper > div {
440
+ .memori-layout-website_assistant.memori--avatar-readyplayerme-full .memori--avatar-wrapper > div,
441
+ .memori-layout-website_assistant.memori--avatar-avatar-configurator .memori--avatar-wrapper > div {
422
442
  transform: scale(1.7) translate(0px, 10vh);
423
443
  }
424
444