@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
@@ -8,7 +8,8 @@
8
8
  background: none;
9
9
  }
10
10
 
11
- .memori-widget > .memori-spin.memori-chat-layout {
11
+ .memori-widget > .memori-spin.memori-chat-layout,
12
+ .memori-widget > .memori-widget__surface > .memori-spin.memori-chat-layout {
12
13
  display: flex;
13
14
  overflow: hidden;
14
15
  height: 100%;
@@ -9,11 +9,13 @@
9
9
  margin-left: auto;
10
10
  }
11
11
 
12
- .memori-widget.memori-layout-fullpage > .memori-spin {
12
+ .memori-widget.memori-layout-fullpage > .memori-spin,
13
+ .memori-widget.memori-layout-fullpage > .memori-widget__surface > .memori-spin {
13
14
  display: flex;
14
- height: calc(100vh - 50px);
15
- height: calc(100dvh - 50px);
15
+ overflow: hidden;
16
+ height: 100%;
16
17
  min-height: 0;
18
+ flex: 1 1 auto;
17
19
  flex-direction: column;
18
20
  gap: 0;
19
21
  }
@@ -156,7 +158,7 @@
156
158
  display: flex;
157
159
  overflow: hidden;
158
160
  min-height: 0;
159
- flex: 1 1 auto;
161
+ flex: 1 1 0%;
160
162
  flex-direction: row;
161
163
  align-items: stretch;
162
164
  }
@@ -168,7 +170,7 @@
168
170
  max-width: var(--memori-layout-max-width);
169
171
  height: 100%;
170
172
  min-height: 0;
171
- flex: 1 1 auto;
173
+ flex: 1 1 0%;
172
174
  align-items: stretch;
173
175
  justify-content: center;
174
176
  padding: 0 var(--memori-spacing-md) var(--memori-spacing-md);
@@ -179,10 +181,16 @@
179
181
  }
180
182
 
181
183
  .memori-widget.memori-layout-fullpage .memori--grid-column-left {
184
+ display: flex;
182
185
  overflow: hidden;
183
186
  width: 50%;
184
187
  max-width: 420px;
188
+ height: 100%;
189
+ min-height: 0;
190
+ flex-direction: column;
185
191
  flex-shrink: 0;
192
+ align-items: stretch;
193
+ align-self: stretch;
186
194
  border: 1px solid color-mix(in srgb, var(--memori-text-color, #111827) 10%, transparent);
187
195
  border-radius: 0.9rem;
188
196
  margin-right: 0;
@@ -191,23 +199,35 @@
191
199
  }
192
200
 
193
201
  .memori-widget.memori-layout-fullpage .memori--grid-column-left .memori--avatar-wrapper {
194
- align-items: flex-start;
195
- padding-top: clamp(1.25rem, 3vw, 2rem);
202
+ position: relative;
203
+ display: flex;
204
+ width: 100%;
205
+ height: 100%;
206
+ min-height: 0;
207
+ flex: 1 1 0%;
208
+ align-items: stretch;
209
+ justify-content: center;
210
+ padding-top: 0;
196
211
  }
197
212
 
198
213
  .memori-widget.memori-layout-fullpage .memori--grid-column-left .memori--avatar-wrapper model-viewer,
199
214
  .memori-widget.memori-layout-fullpage .memori--grid-column-left .memori--avatar-wrapper canvas,
200
215
  .memori-widget.memori-layout-fullpage .memori--grid-column-left .memori--avatar-wrapper > div {
216
+ width: 100% !important;
201
217
  max-width: 100%;
218
+ height: 100% !important;
219
+ max-height: 100%;
202
220
  }
203
221
 
204
222
  .memori-widget.memori-layout-fullpage .memori-chat-layout--main {
205
223
  display: flex;
206
224
  min-width: 0;
225
+ height: 100%;
207
226
  min-height: 0;
208
227
  flex: 1;
209
228
  flex-direction: column;
210
229
  align-items: stretch;
230
+ align-self: stretch;
211
231
  justify-content: stretch;
212
232
  }
213
233
 
@@ -247,7 +267,7 @@
247
267
  height: 100%;
248
268
  min-height: 0;
249
269
  max-height: 100%;
250
- flex: 1 1 auto;
270
+ flex: 1 1 0%;
251
271
  flex-direction: column;
252
272
  align-items: stretch;
253
273
  padding: 0;
@@ -255,10 +275,13 @@
255
275
 
256
276
  .memori-widget.memori-layout-fullpage .memori-chat-layout--controls .memori--start-panel,
257
277
  .memori-widget.memori-layout-fullpage .memori-chat-layout--controls .memori-chat--wrapper {
278
+ display: flex;
258
279
  width: 100%;
259
280
  max-width: 100%;
260
281
  height: 100%;
261
282
  min-height: 0;
283
+ flex: 1 1 0%;
284
+ flex-direction: column;
262
285
  padding: 0 !important;
263
286
  margin-right: 0;
264
287
  margin-left: 0;
@@ -192,6 +192,7 @@
192
192
  right: 0;
193
193
  }
194
194
 
195
+ /* Keep in sync with ArtifactDrawer split width (46% / --memori-modal-size-md override) */
195
196
  .memori-sidebar-toggle-artifact:checked ~ .memori-sidebar-container .memori-sidebar {
196
197
  right: 46%;
197
198
  }
@@ -1,7 +1,9 @@
1
1
  import React from 'react';
2
2
  import { Meta, Story } from '@storybook/react';
3
+ import { Spin } from '@memori.ai/ui';
3
4
  import { memori, tenant, integration } from '../../mocks/data';
4
5
  import Memori, { Props } from '../../index';
6
+ import { LayoutProps } from '../MemoriWidget/MemoriWidget';
5
7
  import I18nWrapper from '../../I18nWrapper';
6
8
  import { VisemeProvider } from '../../context/visemeContext';
7
9
  import { ArtifactProvider } from '../MemoriArtifactSystem/context/ArtifactContext';
@@ -30,25 +32,18 @@ const Template: Story<Props> = args => (
30
32
 
31
33
  const DefaultLayout = Template.bind({});
32
34
  DefaultLayout.args = {
33
- memoriName: 'Layout Storybook',
34
- ownerUserName: 'andrea.patini',
35
- memoriID: 'ae20fc5a-cc15-4db9-b7dd-2cd4a621b85e',
35
+ memoriName: 'prova-sharepoint',
36
+ ownerUserName: 'Andrea-Patini',
37
+ memoriID: '019f129c-a5a3-74d3-b0c8-b7794437bb23',
36
38
  ownerUserID: '91dbc9ba-b684-4fbe-9828-b5980af6cda9',
37
39
  tenantID: 'aisuru-staging.aclambda.online',
38
40
  engineURL: 'https://engine-staging.memori.ai/memori/v2',
39
41
  apiURL: 'https://backend-staging.memori.ai/api/v2',
42
+ baseURL: 'https://aisuru-staging.aclambda.online',
40
43
  layout: 'FULLPAGE',
41
44
  uiLang: 'IT',
42
45
  spokenLang: 'IT',
43
- integrationID: '0b1256c1-530c-4e67-aef8-36667c8887bb',
44
- autoStart: false,
45
- sessionID: '' as string | undefined,
46
- showUpload: true,
47
- showReasoning: false,
48
- showLogin: true,
49
- multilingual: true,
50
- avatar3dHidden: true,
51
- showMessageConsumption: true,
46
+ integrationID: '019f1896-730d-7e19-9a88-6413f485247b',
52
47
  };
53
48
 
54
49
  export const Default = Template.bind({});
@@ -82,6 +77,130 @@ ChatOnly.args = {
82
77
  layout: 'CHAT',
83
78
  };
84
79
 
80
+ const CustomLayout: React.FC<LayoutProps> = ({
81
+ Header,
82
+ headerProps,
83
+ Avatar,
84
+ avatarProps,
85
+ Chat,
86
+ chatProps,
87
+ StartPanel,
88
+ startPanelProps,
89
+ integrationStyle,
90
+ integrationBackground,
91
+ sessionId,
92
+ hasUserActivatedSpeak,
93
+ loading = false,
94
+ poweredBy,
95
+ }) => (
96
+ <>
97
+ {integrationStyle}
98
+ {integrationBackground}
99
+
100
+ <Spin spinning={loading} className="memori-mycustom-layout">
101
+ {poweredBy}
102
+
103
+ <div className="memori-mycustom-layout--controls">
104
+ {sessionId && hasUserActivatedSpeak && Chat && chatProps ? (
105
+ <Chat {...chatProps} />
106
+ ) : startPanelProps ? (
107
+ <StartPanel {...startPanelProps} />
108
+ ) : null}
109
+ </div>
110
+ </Spin>
111
+ </>
112
+ );
113
+
114
+ export const Custom = Template.bind({});
115
+ Custom.args = {
116
+ ...DefaultLayout.args,
117
+ uiLang: 'it',
118
+ showShare: true,
119
+ showSettings: true,
120
+ memori: memori,
121
+ tenant,
122
+ layout: 'FULLPAGE',
123
+ customLayout: CustomLayout,
124
+ };
125
+
126
+ export const WebsiteAssistant2 = Template.bind({});
127
+ WebsiteAssistant2.args = {
128
+ memoriName: 'Marconi Express',
129
+ ownerUserName: 'exmita',
130
+ memoriID: '1755979f-28f1-45d1-8f41-bb34e1f7756b',
131
+ ownerUserID: '3194fcd3-040b-4d5e-a925-691911fb1177',
132
+ tenantID: 'exmachina.aclambda.online',
133
+ engineURL: 'https://engine.memori.ai',
134
+ apiURL: 'https://backend.memori.ai',
135
+ baseURL: 'https://exmachina.aclambda.online',
136
+ uiLang: 'IT',
137
+ avatar3dHidden: true,
138
+ spokenLang: 'IT',
139
+ layout: 'WEBSITE_ASSISTANT',
140
+ };
141
+
142
+ export const WebsiteAssistant3 = Template.bind({});
143
+ WebsiteAssistant3.args = {
144
+ memoriName: 'Layout Storybook',
145
+ ownerUserName: 'Andrea-Patini',
146
+ memoriID: 'ae20fc5a-cc15-4db9-b7dd-2cd4a621b85e',
147
+ ownerUserID: '91dbc9ba-b684-4fbe-9828-b5980af6cda9',
148
+ tenantID: 'aisuru-staging.aclambda.online',
149
+ engineURL: 'https://engine-staging.memori.ai/memori/v2',
150
+ apiURL: 'https://backend-staging.memori.ai/api/v2',
151
+ baseURL: 'http://localhost:3000',
152
+ layout: 'WEBSITE_ASSISTANT',
153
+ avatar3dHidden: true,
154
+ uiLang: 'IT',
155
+ spokenLang: 'IT',
156
+ showOnlyLastMessages: true,
157
+ integrationID: '716f4728-919c-4015-aae1-88998a081c6f',
158
+ };
159
+
160
+ export const WebsiteAssistant = Template.bind({});
161
+ WebsiteAssistant.args = {
162
+ uiLang: 'EN',
163
+ showShare: false,
164
+ showSettings: true,
165
+ memori: memori,
166
+ tenant,
167
+ layout: 'WEBSITE_ASSISTANT',
168
+ memoriName: 'Memori',
169
+ memoriID: '25ced51c-3520-41af-8bbe-222d861b8e32',
170
+ ownerUserName: 'memoridev',
171
+ tenantID: 'www.aisuru.com',
172
+ apiURL: 'https://backend.memori.ai',
173
+ baseURL: 'https://www.aisuru.com',
174
+ spokenLang: 'EN',
175
+ context: {
176
+ SOURCE: 'WEBSITE',
177
+ PATH: '/en/',
178
+ },
179
+ multilingual: true,
180
+ integrationID: 'cb3c4776-7f0b-4f97-a773-c32a5d7a3bf1',
181
+ integration: {
182
+ ...integration,
183
+ customData: JSON.stringify({
184
+ textColor: '#2a2a2a',
185
+ buttonBgColor: '#653165',
186
+ buttonTextColor: '#ffffff',
187
+ blurBackground: true,
188
+ innerBgColor: 'light',
189
+ innerBgAlpha: 0.8,
190
+ multilanguage: true,
191
+ avatar: 'readyplayerme',
192
+ avatarURL:
193
+ 'https://assets.memori.ai/api/v2/asset/b791f77c-1a94-4272-829e-eca82fcc62b7.glb',
194
+ }),
195
+ },
196
+ };
197
+
198
+ export const WebsiteAssistantWithout3DAvatar = Template.bind({});
199
+ WebsiteAssistantWithout3DAvatar.args = {
200
+ ...WebsiteAssistant.args,
201
+ avatar3dHidden: true,
202
+ };
203
+
85
204
  export const HiddenChat = Template.bind({});
86
205
  HiddenChat.args = {
87
206
  ...DefaultLayout.args,
@@ -6,7 +6,8 @@
6
6
  background: linear-gradient(#333, #eee);
7
7
  }
8
8
 
9
- .memori-widget > .memori-spin.memori-totem-layout {
9
+ .memori-widget > .memori-spin.memori-totem-layout,
10
+ .memori-widget > .memori-widget__surface > .memori-spin.memori-totem-layout {
10
11
  display: flex;
11
12
  height: 100%;
12
13
  flex-direction: column;
@@ -17,21 +17,30 @@
17
17
  margin-left: auto;
18
18
  }
19
19
 
20
- .memori-widget.memori-layout-zoomed_full_body > .memori-spin {
20
+ .memori-widget.memori-layout-zoomed_full_body > .memori-spin,
21
+ .memori-widget.memori-layout-zoomed_full_body > .memori-widget__surface > .memori-spin {
21
22
  display: flex;
22
- height: calc(100vh - 50px);
23
- height: calc(100dvh - 50px);
23
+ overflow: hidden;
24
+ height: 100%;
24
25
  min-height: 0;
26
+ flex: 1 1 auto;
25
27
  flex-direction: column;
26
28
  gap: 0;
27
29
  }
28
30
 
29
- /* 3D avatar: pin “Powered by” to the corner so it clears the figure */
31
+ /* 3D avatar: pin “Powered by” to the corner so it clears the figure.
32
+ Order: lower-specificity (no surface) first, then surface variants
33
+ (stylelint no-descending-specificity). */
30
34
  .memori-widget.memori-layout-zoomed_full_body > .memori-spin > .memori--powered-by,
31
35
  .memori-widget.memori-layout-zoomed_full_body.memori--avatar-readyplayerme > .memori-spin > .memori--powered-by,
32
36
  .memori-widget.memori-layout-zoomed_full_body.memori--avatar-readyplayerme-full > .memori-spin > .memori--powered-by,
33
37
  .memori-widget.memori-layout-zoomed_full_body.memori--avatar-customglb > .memori-spin > .memori--powered-by,
34
- .memori-widget.memori-layout-zoomed_full_body.memori--avatar-customrpm > .memori-spin > .memori--powered-by {
38
+ .memori-widget.memori-layout-zoomed_full_body.memori--avatar-customrpm > .memori-spin > .memori--powered-by,
39
+ .memori-widget.memori-layout-zoomed_full_body > .memori-widget__surface > .memori-spin > .memori--powered-by,
40
+ .memori-widget.memori-layout-zoomed_full_body.memori--avatar-readyplayerme > .memori-widget__surface > .memori-spin > .memori--powered-by,
41
+ .memori-widget.memori-layout-zoomed_full_body.memori--avatar-readyplayerme-full > .memori-widget__surface > .memori-spin > .memori--powered-by,
42
+ .memori-widget.memori-layout-zoomed_full_body.memori--avatar-customglb > .memori-widget__surface > .memori-spin > .memori--powered-by,
43
+ .memori-widget.memori-layout-zoomed_full_body.memori--avatar-customrpm > .memori-widget__surface > .memori-spin > .memori--powered-by {
35
44
  bottom: 3.5rem;
36
45
  left: 1.5rem;
37
46
  }
@@ -158,10 +167,16 @@
158
167
  }
159
168
 
160
169
  .memori-widget.memori-layout-zoomed_full_body .memori--grid-column-left {
170
+ display: flex;
161
171
  overflow: hidden;
162
172
  width: 50%;
163
173
  max-width: 420px;
174
+ height: 100%;
175
+ min-height: 0;
176
+ flex-direction: column;
164
177
  flex-shrink: 0;
178
+ align-items: stretch;
179
+ align-self: stretch;
165
180
  border: 1px solid color-mix(in srgb, var(--memori-text-color, #111827) 10%, transparent);
166
181
  border-radius: 0.9rem;
167
182
  margin-right: 0;
@@ -170,14 +185,24 @@
170
185
  }
171
186
 
172
187
  .memori-widget.memori-layout-zoomed_full_body .memori--grid-column-left .memori--avatar-wrapper {
173
- align-items: flex-start;
174
- padding-top: clamp(1.25rem, 3vw, 2rem);
188
+ position: relative;
189
+ display: flex;
190
+ width: 100%;
191
+ height: 100%;
192
+ min-height: 0;
193
+ flex: 1 1 0%;
194
+ align-items: stretch;
195
+ justify-content: center;
196
+ padding-top: 0;
175
197
  }
176
198
 
177
199
  .memori-widget.memori-layout-zoomed_full_body .memori--grid-column-left .memori--avatar-wrapper model-viewer,
178
200
  .memori-widget.memori-layout-zoomed_full_body .memori--grid-column-left .memori--avatar-wrapper canvas,
179
201
  .memori-widget.memori-layout-zoomed_full_body .memori--grid-column-left .memori--avatar-wrapper > div {
202
+ width: 100% !important;
180
203
  max-width: 100%;
204
+ height: 100% !important;
205
+ max-height: 100%;
181
206
  }
182
207
 
183
208
  .memori-widget.memori-layout-zoomed_full_body .memori-chat-layout--main {
@@ -0,0 +1,14 @@
1
+ import React, { createContext, useContext } from 'react';
2
+
3
+ /**
4
+ * Portal target for fixed overlays (Drawer/Modal) that must stay clipped to the
5
+ * chat widget. Kept separate from MemoriUIProvider's container so Floating UI
6
+ * menus (Select/Popover) can portal to the widget root *outside* `contain: layout`.
7
+ */
8
+ const WidgetSurfaceContext = createContext<HTMLElement | null>(null);
9
+
10
+ export const WidgetSurfaceProvider = WidgetSurfaceContext.Provider;
11
+
12
+ export function useWidgetSurfaceEl(): HTMLElement | null {
13
+ return useContext(WidgetSurfaceContext);
14
+ }
@@ -36,7 +36,7 @@ export const getGroupedChatLanguages = () => {
36
36
  popularLanguageCodes.includes(lang.value)
37
37
  );
38
38
  const all = chatLanguages.filter(lang => !popularLanguageCodes.includes(lang.value));
39
- return {
39
+ return {
40
40
  popular,
41
41
  all,
42
42
  };
@@ -44,6 +44,15 @@ export const getGroupedChatLanguages = () => {
44
44
 
45
45
  export const uiLanguages = ['en', 'it', 'fr', 'es', 'de'];
46
46
 
47
+ /** Extensions uploaded as original Office binaries (no text extraction) */
48
+ export const officeNativeExtensions = [
49
+ '.doc',
50
+ '.docx',
51
+ '.dotx',
52
+ '.xltx',
53
+ '.potx',
54
+ ] as const;
55
+
47
56
  export const allowedMediaTypes = [
48
57
  'image/jpeg',
49
58
  'image/png',
@@ -51,6 +60,7 @@ export const allowedMediaTypes = [
51
60
  'image/gif',
52
61
  'application/msword',
53
62
  'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
63
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
54
64
  'application/vnd.ms-excel',
55
65
  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
56
66
  'application/pdf',
@@ -63,6 +73,27 @@ export const allowedMediaTypes = [
63
73
  'model/gltf-binary',
64
74
  ];
65
75
 
76
+ /** Short badge labels for Office document cards */
77
+ export const officeMimeShortLabels: Record<string, string> = {
78
+ 'application/msword': 'Word',
79
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'Word',
80
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': 'Word',
81
+ 'application/vnd.ms-excel': 'Excel',
82
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'Excel',
83
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.template': 'Excel',
84
+ 'application/vnd.openxmlformats-officedocument.presentationml.template': 'PPT',
85
+ };
86
+
87
+ export const officeExtensionShortLabels: Record<string, string> = {
88
+ DOC: 'Word',
89
+ DOCX: 'Word',
90
+ DOTX: 'Word',
91
+ XLS: 'Excel',
92
+ XLSX: 'Excel',
93
+ XLTX: 'Excel',
94
+ POTX: 'PPT',
95
+ };
96
+
66
97
  export const anonTag = '👤';
67
98
 
68
99
  export const prismSyntaxLangs = [
@@ -1,23 +1,37 @@
1
1
  // POST http://localhost:3000/api/verify-tokens operation=session_creation userID=585ec0ff-e805-495e-b8fc-5b0b8dd288ff tenant=aisuru-staging-tokenized.aclambda.online
2
+ export type CreditsOperation =
3
+ | 'twin_creation'
4
+ | 'session_creation'
5
+ | 'import_document'
6
+ // accepted by the API and normalized to session_creation
7
+ | 'dt_session_creation';
8
+
2
9
  export const getCredits = async ({
3
10
  operation = 'session_creation',
4
11
  baseUrl,
5
12
  userID,
6
13
  userName,
7
14
  tenant,
15
+ characters,
8
16
  }: {
9
- operation?: string;
17
+ operation?: CreditsOperation;
10
18
  baseUrl: string;
11
19
  userID?: string | null;
12
20
  userName?: string | null;
13
21
  tenant: string;
22
+ characters?: number;
14
23
  }): Promise<{
15
24
  enough: boolean;
16
25
  required: number;
26
+ tokens?: number;
17
27
  }> => {
18
28
  if (!userID && !userName) {
19
29
  throw new Error('Either userID or userName must be provided');
20
30
  }
31
+ if (operation === 'import_document' && characters == null) {
32
+ throw new Error('characters must be provided for import_document');
33
+ }
34
+
21
35
  const resp = await fetch(`${baseUrl}/api/verify-tokens`, {
22
36
  method: 'POST',
23
37
  headers: {
@@ -28,6 +42,7 @@ export const getCredits = async ({
28
42
  userID,
29
43
  userName,
30
44
  tenant,
45
+ ...(operation === 'import_document' ? { characters } : {}),
31
46
  }),
32
47
  });
33
48
 
@@ -1,4 +1,24 @@
1
- import { renderMsg, stripAttachmentTags, stripAllInternalTags } from './message';
1
+ import {
2
+ renderMsg,
3
+ sanitizeMsg,
4
+ stripAttachmentTags,
5
+ stripAllInternalTags,
6
+ } from './message';
7
+
8
+ describe('sanitizeMsg', () => {
9
+ it('strips onerror from partner XSS img payload', () => {
10
+ const payload =
11
+ '<img src="immagine-inesistente.jpg" onerror="alert(\'XSS Eseguito!\')">';
12
+ const result = sanitizeMsg(payload);
13
+ expect(result).toBe('<img src="immagine-inesistente.jpg">');
14
+ expect(result).not.toMatch(/onerror/i);
15
+ });
16
+
17
+ it('strips svg onload handlers', () => {
18
+ const result = sanitizeMsg('<svg onload="alert(1)"></svg>');
19
+ expect(result).not.toMatch(/onload/i);
20
+ });
21
+ });
2
22
 
3
23
  describe('renderMsg', () => {
4
24
  it('should render message with reasoning and output tag adjacent correctly', () => {
@@ -11,6 +31,13 @@ describe('renderMsg', () => {
11
31
  '<details class="memori-think"><summary>Reasoning...</summary>L\'utente vuole che io elenchi i parametri dell\'ALBERO ESISTENTE.</details>\n\n<output class="rails-query" style="display:none">\nproject = Project.find("68d99b05783713e16737d32b")\n</output>\n\n<p>Recupero tutti i 7 parametri dell\'ALBERO ESISTENTE...</p>'
12
32
  );
13
33
  });
34
+
35
+ it('strips onerror from XSS img payload in rendered output', () => {
36
+ const payload =
37
+ '<img src="immagine-inesistente.jpg" onerror="alert(\'XSS Eseguito!\')">';
38
+ const result = renderMsg(payload, false, 'Reasoning...', false);
39
+ expect(result.text).not.toMatch(/onerror/i);
40
+ });
14
41
  });
15
42
 
16
43
  describe('stripAttachmentTags', () => {
@@ -85,6 +85,9 @@ export const truncateMessage = (message: string) => {
85
85
  return truncatedMessage;
86
86
  };
87
87
 
88
+ export const sanitizeMsg = (msg: string) =>
89
+ DOMPurify.sanitize(msg, { ADD_ATTR: ['target'] });
90
+
88
91
  export const renderMsg = (
89
92
  text: string,
90
93
  useMathFormatting = false,
@@ -196,9 +199,6 @@ export const renderMsg = (
196
199
  return { text: finalText };
197
200
  } catch (e) {
198
201
  console.error('Error rendering message:', e);
199
- return { text };
202
+ return { text: sanitizeMsg(text) };
200
203
  }
201
204
  };
202
-
203
- export const sanitizeMsg = (msg: string) =>
204
- DOMPurify.sanitize(msg, { ADD_ATTR: ['target'] });