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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/CHANGELOG.md +456 -1
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.css +1 -7
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +1 -1
  4. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  5. package/dist/components/Auth/Auth.css +12 -5
  6. package/dist/components/Auth/Auth.d.ts +1 -1
  7. package/dist/components/Auth/Auth.js +46 -32
  8. package/dist/components/Auth/Auth.js.map +1 -1
  9. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +1 -1
  10. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  11. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -2
  12. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js +6 -6
  13. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  14. package/dist/components/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  15. package/dist/components/Chat/Chat.css +1 -0
  16. package/dist/components/Chat/Chat.js +1 -1
  17. package/dist/components/Chat/Chat.js.map +1 -1
  18. package/dist/components/ChatBubble/ChatBubble.css +32 -5
  19. package/dist/components/ChatBubble/ChatBubble.js +2 -4
  20. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  21. package/dist/components/ChatHistoryDrawer/ChatHistory.d.ts +3 -1
  22. package/dist/components/ChatHistoryDrawer/ChatHistory.js +2 -2
  23. package/dist/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  24. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  25. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.d.ts +3 -1
  26. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.js +7 -57
  27. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  28. package/dist/components/ChatInputs/ChatInputs.js +11 -2
  29. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  30. package/dist/components/ChatTextArea/ChatTextArea.css +1 -1
  31. package/dist/components/ContentPreviewModal/ContentPreviewModal.css +7 -32
  32. package/dist/components/ContentPreviewModal/ContentPreviewModal.js +1 -1
  33. package/dist/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  34. package/dist/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  35. package/dist/components/FilePreview/FilePreview.css +41 -20
  36. package/dist/components/FilePreview/FilePreview.d.ts +2 -1
  37. package/dist/components/FilePreview/FilePreview.js +6 -2
  38. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  39. package/dist/components/Header/Header.css +8 -3
  40. package/dist/components/Header/Header.js +15 -18
  41. package/dist/components/Header/Header.js.map +1 -1
  42. package/dist/components/IconButton/IconButton.d.ts +1 -1
  43. package/dist/components/KnownFacts/KnownFacts.css +1 -1
  44. package/dist/components/KnownFacts/KnownFacts.js +4 -7
  45. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  46. package/dist/components/LoginDrawer/LoginDrawer.css +16 -14
  47. package/dist/components/LoginDrawer/LoginDrawer.js +19 -11
  48. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  49. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js +1 -1
  50. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js.map +1 -1
  51. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js +14 -12
  52. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js.map +1 -1
  53. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -110
  54. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +36 -14
  55. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +3 -2
  56. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  57. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +7 -0
  58. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +210 -62
  59. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  60. package/dist/components/MemoriArtifactSystem/context/ArtifactContext.d.ts +3 -1
  61. package/dist/components/MemoriArtifactSystem/context/ArtifactContext.js +65 -1
  62. package/dist/components/MemoriArtifactSystem/context/ArtifactContext.js.map +1 -1
  63. package/dist/components/MemoriArtifactSystem/types/artifact.types.d.ts +11 -0
  64. package/dist/components/MemoriArtifactSystem/utils/ArtifactAPI.js +18 -13
  65. package/dist/components/MemoriArtifactSystem/utils/ArtifactAPI.js.map +1 -1
  66. package/dist/components/MemoriArtifactSystem/utils/applyEdits.d.ts +8 -0
  67. package/dist/components/MemoriArtifactSystem/utils/applyEdits.js +117 -0
  68. package/dist/components/MemoriArtifactSystem/utils/applyEdits.js.map +1 -0
  69. package/dist/components/MemoriWidget/MemoriWidget.css +59 -0
  70. package/dist/components/MemoriWidget/MemoriWidget.js +35 -31
  71. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  72. package/dist/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  73. package/dist/components/PositionPopover/PositionPopover.css +3 -3
  74. package/dist/components/PositionPopover/PositionPopover.js +38 -25
  75. package/dist/components/PositionPopover/PositionPopover.js.map +1 -1
  76. package/dist/components/Snippet/Snippet.css +6 -36
  77. package/dist/components/Snippet/Snippet.js +3 -1
  78. package/dist/components/Snippet/Snippet.js.map +1 -1
  79. package/dist/components/StartPanel/StartPanel.css +125 -3
  80. package/dist/components/StartPanel/StartPanel.js +13 -19
  81. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  82. package/dist/components/UploadButton/UploadButton.css +0 -19
  83. package/dist/components/UploadButton/UploadButton.js +1 -3
  84. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  85. package/dist/components/UploadButton/UploadImages/UploadImages.js +1 -1
  86. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  87. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  88. package/dist/components/layouts/chat.css +2 -0
  89. package/dist/components/layouts/totem.css +43 -9
  90. package/dist/components/layouts/zoomed-full-body.css +1 -0
  91. package/dist/helpers/message.js +3 -0
  92. package/dist/helpers/message.js.map +1 -1
  93. package/dist/helpers/positionPopover.d.ts +2 -1
  94. package/dist/helpers/positionPopover.js +10 -2
  95. package/dist/helpers/positionPopover.js.map +1 -1
  96. package/dist/icons/MemoriIcon.js +1 -1
  97. package/dist/icons/MemoriIcon.js.map +1 -1
  98. package/dist/locales/de.json +7 -1
  99. package/dist/locales/en.json +6 -1
  100. package/dist/locales/es.json +6 -1
  101. package/dist/locales/fr.json +6 -1
  102. package/dist/locales/it.json +6 -1
  103. package/dist/styles.css +1 -1
  104. package/dist/version.d.ts +1 -1
  105. package/dist/version.js +1 -1
  106. package/esm/components/AgeVerificationModal/AgeVerificationModal.css +1 -7
  107. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +1 -1
  108. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  109. package/esm/components/Auth/Auth.css +12 -5
  110. package/esm/components/Auth/Auth.d.ts +1 -1
  111. package/esm/components/Auth/Auth.js +47 -33
  112. package/esm/components/Auth/Auth.js.map +1 -1
  113. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +2 -2
  114. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  115. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -2
  116. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js +4 -5
  117. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  118. package/esm/components/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  119. package/esm/components/Chat/Chat.css +1 -0
  120. package/esm/components/Chat/Chat.js +1 -1
  121. package/esm/components/Chat/Chat.js.map +1 -1
  122. package/esm/components/ChatBubble/ChatBubble.css +32 -5
  123. package/esm/components/ChatBubble/ChatBubble.js +2 -4
  124. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  125. package/esm/components/ChatHistoryDrawer/ChatHistory.d.ts +3 -1
  126. package/esm/components/ChatHistoryDrawer/ChatHistory.js +2 -2
  127. package/esm/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  128. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  129. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.d.ts +3 -1
  130. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js +9 -59
  131. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  132. package/esm/components/ChatInputs/ChatInputs.js +12 -3
  133. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  134. package/esm/components/ChatTextArea/ChatTextArea.css +1 -1
  135. package/esm/components/ContentPreviewModal/ContentPreviewModal.css +7 -32
  136. package/esm/components/ContentPreviewModal/ContentPreviewModal.js +1 -1
  137. package/esm/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  138. package/esm/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  139. package/esm/components/FilePreview/FilePreview.css +41 -20
  140. package/esm/components/FilePreview/FilePreview.d.ts +2 -1
  141. package/esm/components/FilePreview/FilePreview.js +7 -3
  142. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  143. package/esm/components/Header/Header.css +8 -3
  144. package/esm/components/Header/Header.js +15 -18
  145. package/esm/components/Header/Header.js.map +1 -1
  146. package/esm/components/IconButton/IconButton.d.ts +1 -1
  147. package/esm/components/KnownFacts/KnownFacts.css +1 -1
  148. package/esm/components/KnownFacts/KnownFacts.js +4 -7
  149. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  150. package/esm/components/LoginDrawer/LoginDrawer.css +16 -14
  151. package/esm/components/LoginDrawer/LoginDrawer.js +20 -12
  152. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  153. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js +1 -1
  154. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js.map +1 -1
  155. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js +15 -13
  156. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js.map +1 -1
  157. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -110
  158. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +36 -14
  159. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +3 -2
  160. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  161. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +7 -0
  162. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +211 -63
  163. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  164. package/esm/components/MemoriArtifactSystem/context/ArtifactContext.d.ts +3 -1
  165. package/esm/components/MemoriArtifactSystem/context/ArtifactContext.js +66 -2
  166. package/esm/components/MemoriArtifactSystem/context/ArtifactContext.js.map +1 -1
  167. package/esm/components/MemoriArtifactSystem/types/artifact.types.d.ts +11 -0
  168. package/esm/components/MemoriArtifactSystem/utils/ArtifactAPI.js +18 -13
  169. package/esm/components/MemoriArtifactSystem/utils/ArtifactAPI.js.map +1 -1
  170. package/esm/components/MemoriArtifactSystem/utils/applyEdits.d.ts +8 -0
  171. package/esm/components/MemoriArtifactSystem/utils/applyEdits.js +112 -0
  172. package/esm/components/MemoriArtifactSystem/utils/applyEdits.js.map +1 -0
  173. package/esm/components/MemoriWidget/MemoriWidget.css +59 -0
  174. package/esm/components/MemoriWidget/MemoriWidget.js +36 -32
  175. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  176. package/esm/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  177. package/esm/components/PositionPopover/PositionPopover.css +3 -3
  178. package/esm/components/PositionPopover/PositionPopover.js +39 -26
  179. package/esm/components/PositionPopover/PositionPopover.js.map +1 -1
  180. package/esm/components/Snippet/Snippet.css +6 -36
  181. package/esm/components/Snippet/Snippet.js +4 -2
  182. package/esm/components/Snippet/Snippet.js.map +1 -1
  183. package/esm/components/StartPanel/StartPanel.css +125 -3
  184. package/esm/components/StartPanel/StartPanel.js +14 -20
  185. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  186. package/esm/components/UploadButton/UploadButton.css +0 -19
  187. package/esm/components/UploadButton/UploadButton.js +1 -3
  188. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  189. package/esm/components/UploadButton/UploadImages/UploadImages.js +1 -1
  190. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  191. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  192. package/esm/components/layouts/chat.css +2 -0
  193. package/esm/components/layouts/totem.css +43 -9
  194. package/esm/components/layouts/zoomed-full-body.css +1 -0
  195. package/esm/helpers/message.js +3 -0
  196. package/esm/helpers/message.js.map +1 -1
  197. package/esm/helpers/positionPopover.d.ts +2 -1
  198. package/esm/helpers/positionPopover.js +9 -2
  199. package/esm/helpers/positionPopover.js.map +1 -1
  200. package/esm/icons/MemoriIcon.js +1 -1
  201. package/esm/icons/MemoriIcon.js.map +1 -1
  202. package/esm/locales/de.json +7 -1
  203. package/esm/locales/en.json +6 -1
  204. package/esm/locales/es.json +6 -1
  205. package/esm/locales/fr.json +6 -1
  206. package/esm/locales/it.json +6 -1
  207. package/esm/styles.css +1 -1
  208. package/esm/version.d.ts +1 -1
  209. package/esm/version.js +1 -1
  210. package/package.json +5 -3
  211. package/src/Live/Agents.stories.tsx +49 -0
  212. package/src/Live/KnownFacts.stories.tsx +50 -0
  213. package/src/Showcase.stories.tsx +3 -14
  214. package/src/components/AgeVerificationModal/AgeVerificationModal.css +1 -7
  215. package/src/components/AgeVerificationModal/AgeVerificationModal.stories.tsx +1 -1
  216. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +1 -0
  217. package/src/components/Auth/Auth.css +12 -5
  218. package/src/components/Auth/Auth.stories.tsx +1 -1
  219. package/src/components/Auth/Auth.test.tsx +68 -1
  220. package/src/components/Auth/Auth.tsx +69 -54
  221. package/src/components/Auth/__snapshots__/Auth.test.tsx.snap +5 -6
  222. package/src/components/Avatar/Avatar.stories.tsx +1 -18
  223. package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx +2 -2
  224. package/src/components/Avatar/AvatarView/AvatarComponent/constants.test.ts +19 -0
  225. package/src/components/Avatar/AvatarView/AvatarComponent/constants.ts +9 -6
  226. package/src/components/Avatar/AvatarView/AvatarView.stories.tsx +1 -103
  227. package/src/components/Blob/Blob.stories.tsx +1 -1
  228. package/src/components/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  229. package/src/components/BlockedMemoriBadge/BlockedMemoriBadge.stories.tsx +1 -1
  230. package/src/components/ChangeMode/ChangeMode.stories.tsx +1 -1
  231. package/src/components/Chat/Chat.css +1 -0
  232. package/src/components/Chat/Chat.stories.tsx +61 -7
  233. package/src/components/Chat/Chat.tsx +1 -0
  234. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +80 -80
  235. package/src/components/ChatBubble/ChatBubble.css +32 -5
  236. package/src/components/ChatBubble/ChatBubble.stories.tsx +13 -2
  237. package/src/components/ChatBubble/ChatBubble.test.tsx +21 -1
  238. package/src/components/ChatBubble/ChatBubble.tsx +7 -13
  239. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +158 -185
  240. package/src/components/ChatHistoryDrawer/ChatHistory.stories.tsx +1 -1
  241. package/src/components/ChatHistoryDrawer/ChatHistory.tsx +6 -0
  242. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  243. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.tsx +24 -81
  244. package/src/components/ChatInputs/ChatInputs.stories.tsx +1 -39
  245. package/src/components/ChatInputs/ChatInputs.test.tsx +47 -0
  246. package/src/components/ChatInputs/ChatInputs.tsx +13 -2
  247. package/src/components/ChatTextArea/ChatTextArea.css +1 -1
  248. package/src/components/CompletionProviderStatus/CompletionProviderStatus.stories.tsx +1 -1
  249. package/src/components/ContentPreviewModal/ContentPreviewModal.css +7 -32
  250. package/src/components/ContentPreviewModal/ContentPreviewModal.tsx +1 -1
  251. package/src/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  252. package/src/components/ExpertsDrawer/ExpertsDrawer.stories.tsx +1 -1
  253. package/src/components/FeedbackButtons/FeedbackButtons.stories.tsx +29 -10
  254. package/src/components/FilePreview/FilePreview.css +41 -20
  255. package/src/components/FilePreview/FilePreview.tsx +14 -0
  256. package/src/components/FilePreview/__snapshots__/FilePreview.test.tsx.snap +14 -0
  257. package/src/components/Header/Header.css +8 -3
  258. package/src/components/Header/Header.stories.tsx +1 -1
  259. package/src/components/Header/Header.tsx +146 -117
  260. package/src/components/KnownFacts/KnownFacts.css +1 -1
  261. package/src/components/KnownFacts/KnownFacts.stories.tsx +1 -23
  262. package/src/components/KnownFacts/KnownFacts.tsx +4 -11
  263. package/src/components/LoginDrawer/LoginDrawer.css +16 -14
  264. package/src/components/LoginDrawer/LoginDrawer.stories.tsx +2 -52
  265. package/src/components/LoginDrawer/LoginDrawer.tsx +51 -39
  266. package/src/components/MediaWidget/MediaItemWidget.stories.tsx +1 -15
  267. package/src/components/MediaWidget/MediaPreviewModal.test.tsx +2 -3
  268. package/src/components/MediaWidget/MediaWidget.stories.tsx +1 -45
  269. package/src/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.tsx +19 -33
  270. package/src/components/MemoriArtifactSystem/components/ArtifactActions/CopyButton.stories.tsx +1 -1
  271. package/src/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.tsx +44 -45
  272. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -110
  273. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +36 -14
  274. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +28 -26
  275. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +7 -0
  276. package/src/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.tsx +357 -148
  277. package/src/components/MemoriArtifactSystem/context/ArtifactContext.tsx +111 -9
  278. package/src/components/MemoriArtifactSystem/types/artifact.types.ts +20 -1
  279. package/src/components/MemoriArtifactSystem/utils/ArtifactAPI.test.tsx +33 -28
  280. package/src/components/MemoriArtifactSystem/utils/ArtifactAPI.tsx +19 -13
  281. package/src/components/MemoriArtifactSystem/utils/applyEdits.test.ts +85 -0
  282. package/src/components/MemoriArtifactSystem/utils/applyEdits.ts +173 -0
  283. package/src/components/MemoriWidget/MemoriUIProvider.contract.test.tsx +55 -0
  284. package/src/components/MemoriWidget/MemoriWidget.css +59 -0
  285. package/src/components/MemoriWidget/MemoriWidget.stories.tsx +55 -77
  286. package/src/components/MemoriWidget/MemoriWidget.tsx +49 -44
  287. package/src/components/MemoriWidget/getChatStyles.test.ts +24 -0
  288. package/src/components/MicrophoneButton/MicrophoneButton.stories.tsx +1 -1
  289. package/src/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  290. package/src/components/PositionPopover/PositionPopover.css +3 -3
  291. package/src/components/PositionPopover/PositionPopover.stories.tsx +1 -1
  292. package/src/components/PositionPopover/PositionPopover.tsx +50 -28
  293. package/src/components/PoweredBy/PoweredBy.stories.tsx +1 -54
  294. package/src/components/PoweredBy/__snapshots__/PoweredBy.test.tsx.snap +2 -2
  295. package/src/components/SendOnEnterMenu/SendOnEnterMenu.stories.tsx +1 -1
  296. package/src/components/SettingsDrawer/SettingsDrawer.stories.tsx +1 -1
  297. package/src/components/ShareButton/ShareButton.stories.tsx +1 -1
  298. package/src/components/Snippet/Snippet.css +6 -36
  299. package/src/components/Snippet/Snippet.stories.tsx +1 -1
  300. package/src/components/Snippet/Snippet.tsx +6 -7
  301. package/src/components/StartPanel/StartPanel.css +125 -3
  302. package/src/components/StartPanel/StartPanel.stories.tsx +22 -2
  303. package/src/components/StartPanel/StartPanel.tsx +30 -35
  304. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +177 -121
  305. package/src/components/Typing/Typing.stories.tsx +1 -1
  306. package/src/components/UploadButton/UploadButton.css +0 -19
  307. package/src/components/UploadButton/UploadButton.tsx +0 -11
  308. package/src/components/UploadButton/UploadImages/UploadImages.tsx +1 -1
  309. package/src/components/WhyThisAnswer/WhyThisAnswer.stories.tsx +22 -44
  310. package/src/components/layouts/FullBody/FullBody.stories.tsx +55 -68
  311. package/src/components/layouts/Totem/Totem.stories.tsx +69 -87
  312. package/src/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  313. package/src/components/layouts/ZoomedFullBody/ZoomedFullBody.stories.tsx +69 -87
  314. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +19 -41
  315. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +39 -83
  316. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +15 -11
  317. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +116 -42
  318. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +18 -40
  319. package/src/components/layouts/chat.css +2 -0
  320. package/src/components/layouts/layouts.stories.tsx +96 -179
  321. package/src/components/layouts/totem.css +43 -9
  322. package/src/components/layouts/zoomed-full-body.css +1 -0
  323. package/src/helpers/message.ts +15 -0
  324. package/src/helpers/positionPopover.test.ts +36 -1
  325. package/src/helpers/positionPopover.ts +21 -4
  326. package/src/i18n.knownFacts.test.ts +40 -0
  327. package/src/icons/MemoriIcon.tsx +1 -1
  328. package/src/index.stories.tsx +1 -47
  329. package/src/locales/de.json +7 -1
  330. package/src/locales/en.json +6 -1
  331. package/src/locales/es.json +6 -1
  332. package/src/locales/fr.json +6 -1
  333. package/src/locales/it.json +6 -1
  334. package/src/styles.css +13 -27
  335. package/src/version.ts +1 -1
  336. package/src/components/ChatTextArea/ChatTextArea.stories.tsx +0 -55
  337. package/src/components/CustomGLBModelViewer/ModelViewer.stories.tsx +0 -58
  338. package/src/components/DateSelector/DateSelector.stories.tsx +0 -47
  339. package/src/components/FilePreview/FilePreview.stories.tsx +0 -63
  340. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +0 -265
  341. package/src/components/UploadButton/UploadButton.stories.tsx +0 -510
  342. package/src/components/VenueWidget/VenueWidget.stories.tsx +0 -69
  343. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.stories.tsx +0 -115
@@ -41,6 +41,8 @@ export interface Props {
41
41
  language: string;
42
42
  userLang: string;
43
43
  isMultilanguageEnabled?: boolean;
44
+ showFunctionCache?: boolean;
45
+ showMessageConsumption?: boolean;
44
46
  }
45
47
 
46
48
  const ITEMS_PER_PAGE = 8;
@@ -453,6 +455,8 @@ const ChatHistoryDrawer = ({
453
455
  language,
454
456
  userLang,
455
457
  isMultilanguageEnabled = false,
458
+ showFunctionCache = false,
459
+ showMessageConsumption = false,
456
460
  }: Props) => {
457
461
  const surfaceEl = useWidgetSurfaceEl();
458
462
  const { t } = useTranslation();
@@ -1187,6 +1191,8 @@ const ChatHistoryDrawer = ({
1187
1191
  onBack={handleCloseResumeDrawer}
1188
1192
  onClose={handleCloseResumeDrawer}
1189
1193
  onExportChat={handleExportSelectedChat}
1194
+ showFunctionCache={showFunctionCache}
1195
+ showMessageConsumption={showMessageConsumption}
1190
1196
  />
1191
1197
  </div>
1192
1198
  ) : (
@@ -1,5 +1,5 @@
1
1
  .memori-chat-resume-drawer {
2
- position: fixed;
2
+ position: absolute;
3
3
  z-index: 1200;
4
4
  inset: 0;
5
5
  pointer-events: none;
@@ -1,5 +1,5 @@
1
- import React, { useEffect, useMemo, useRef, useState } from 'react';
2
- import { Button } from '@memori.ai/ui';
1
+ import React, { useEffect, useMemo, useRef } from 'react';
2
+ import { Button, Drawer } from '@memori.ai/ui';
3
3
  import {
4
4
  Message,
5
5
  Memori,
@@ -7,6 +7,7 @@ import {
7
7
  import { ArrowLeft, ArrowUpRight, Download } from 'lucide-react';
8
8
  import { useTranslation } from 'react-i18next';
9
9
  import { stripHTML } from '../../helpers/utils';
10
+ import { useWidgetSurfaceEl } from '../../context/widgetSurfaceContext';
10
11
  import Chat from '../Chat/Chat';
11
12
 
12
13
  export interface ResumeDrawerMessage {
@@ -29,6 +30,10 @@ export interface ChatResumeDrawerProps {
29
30
  onClose: () => void;
30
31
  onBack?: () => void;
31
32
  onExportChat: () => void;
33
+ /**
34
+ * When true, render panel content only (nested inside ChatHistory Drawer).
35
+ * When false, open as a library Drawer on the widget surface.
36
+ */
32
37
  embedded?: boolean;
33
38
  session: {
34
39
  title: string;
@@ -39,9 +44,10 @@ export interface ChatResumeDrawerProps {
39
44
  };
40
45
  onResume: (prompt?: string) => void;
41
46
  isLoading?: boolean;
47
+ showFunctionCache?: boolean;
48
+ showMessageConsumption?: boolean;
42
49
  }
43
50
 
44
- const ANIMATION_DURATION_MS = 280;
45
51
  const EMPTY_MEMORI = {
46
52
  memoriID: 'chat-resume-drawer',
47
53
  name: 'AI',
@@ -71,75 +77,19 @@ const ChatResumeDrawer = ({
71
77
  onResume,
72
78
  isLoading = false,
73
79
  onExportChat,
80
+ showFunctionCache = false,
81
+ showMessageConsumption = false,
74
82
  }: ChatResumeDrawerProps) => {
75
83
  const { t } = useTranslation();
76
- const dialogRef = useRef<HTMLDivElement>(null);
77
- const panelRef = useRef<HTMLDivElement>(null);
84
+ const surfaceEl = useWidgetSurfaceEl();
78
85
  const backButtonRef = useRef<HTMLButtonElement>(null);
79
86
  const titleId = 'chat-resume-drawer-title';
80
- const [shouldRender, setShouldRender] = useState(isOpen);
81
- const [isVisible, setIsVisible] = useState(isOpen);
82
-
83
- useEffect(() => {
84
- if (isOpen) {
85
- setShouldRender(true);
86
- requestAnimationFrame(() => setIsVisible(true));
87
- return;
88
- }
89
-
90
- setIsVisible(false);
91
- const timeout = window.setTimeout(() => {
92
- setShouldRender(false);
93
- }, ANIMATION_DURATION_MS);
94
-
95
- return () => window.clearTimeout(timeout);
96
- }, [isOpen]);
97
87
 
98
88
  useEffect(() => {
99
89
  if (!isOpen) return;
100
90
  backButtonRef.current?.focus();
101
91
  }, [isOpen]);
102
92
 
103
- useEffect(() => {
104
- if (!isOpen || embedded) return;
105
-
106
- const previouslyFocused = document.activeElement as HTMLElement | null;
107
- const root = dialogRef.current;
108
- if (!root) return;
109
-
110
- const handleKeyDown = (event: KeyboardEvent) => {
111
- if (event.key === 'Escape') {
112
- onClose();
113
- return;
114
- }
115
-
116
- if (event.key !== 'Tab') return;
117
-
118
- const focusableElements = root.querySelectorAll<HTMLElement>(
119
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
120
- );
121
- if (!focusableElements.length) return;
122
-
123
- const first = focusableElements[0];
124
- const last = focusableElements[focusableElements.length - 1];
125
- const active = document.activeElement as HTMLElement | null;
126
-
127
- if (event.shiftKey && active === first) {
128
- event.preventDefault();
129
- last.focus();
130
- } else if (!event.shiftKey && active === last) {
131
- event.preventDefault();
132
- first.focus();
133
- }
134
- };
135
-
136
- document.addEventListener('keydown', handleKeyDown);
137
- return () => {
138
- document.removeEventListener('keydown', handleKeyDown);
139
- previouslyFocused?.focus();
140
- };
141
- }, [embedded, isOpen, onClose]);
142
-
143
93
  const safeTitle = useMemo(() => {
144
94
  const cleaned = stripMarkdownChars(stripHTML(session.title || ''));
145
95
  return cleaned || 'Conversazione';
@@ -170,15 +120,11 @@ const ChatResumeDrawer = ({
170
120
  [session.messages]
171
121
  );
172
122
 
173
- if (!embedded && !shouldRender) return null;
174
-
175
123
  const content = (
176
124
  <div
177
- ref={panelRef}
178
125
  className={`memori-chat-resume-drawer--panel ${
179
126
  embedded ? 'memori-chat-resume-drawer--panel-embedded' : ''
180
127
  }`}
181
- onClick={event => event.stopPropagation()}
182
128
  >
183
129
  <header className="memori-chat-resume-drawer--header">
184
130
  <Button
@@ -247,6 +193,8 @@ const ChatResumeDrawer = ({
247
193
  showCopyButton={true}
248
194
  isHistoryView={true}
249
195
  isChatlogPanel={true}
196
+ showFunctionCache={showFunctionCache}
197
+ showMessageConsumption={showMessageConsumption}
250
198
  />
251
199
  </div>
252
200
  )}
@@ -266,29 +214,24 @@ const ChatResumeDrawer = ({
266
214
  );
267
215
 
268
216
  if (embedded) {
217
+ if (!isOpen) return null;
269
218
  return (
270
219
  <div className="memori-chat-resume-drawer--embedded-shell">{content}</div>
271
220
  );
272
221
  }
273
222
 
274
223
  return (
275
- <div
276
- ref={dialogRef}
277
- className={`memori-chat-resume-drawer ${
278
- isVisible ? 'memori-chat-resume-drawer--open' : ''
279
- }`}
280
- role="dialog"
281
- aria-modal="true"
282
- aria-labelledby={titleId}
224
+ <Drawer
225
+ container={surfaceEl ?? undefined}
226
+ open={isOpen}
227
+ onClose={onClose}
228
+ className="memori-chat-resume-drawer"
229
+ anchor="right"
230
+ size="md"
231
+ showCloseButton={false}
283
232
  >
284
- <Button
285
- className="memori-chat-resume-drawer--backdrop"
286
- type="button"
287
- aria-label={String(t('close', { defaultValue: 'Close' }))}
288
- onClick={onClose}
289
- />
290
233
  {content}
291
- </div>
234
+ </Drawer>
292
235
  );
293
236
  };
294
237
 
@@ -8,7 +8,7 @@ import './ChatInputs.css';
8
8
  import { AlertProvider } from '@memori.ai/ui';
9
9
 
10
10
  const meta: Meta = {
11
- title: 'Widget/Chat inputs (footer)',
11
+ title: 'Compositions/Chat inputs',
12
12
  component: ChatInputs,
13
13
  argTypes: {
14
14
  disabled: {
@@ -192,44 +192,6 @@ Disabled.args = {
192
192
  showMicrophone: true,
193
193
  };
194
194
 
195
- export const ContinuousSpeech = Template.bind({});
196
- ContinuousSpeech.args = {
197
- dialogState,
198
- userMessage: 'Suspendisse sit amet volutpat velit.',
199
- sendMessage: (msg: string) => console.log(msg),
200
- onTextareaBlur: () => {},
201
- onTextareaFocus: () => {},
202
- onTextareaPressEnter: () => {},
203
- setAttachmentsMenuOpen: () => {},
204
- setSendOnEnter: () => {},
205
- listening: false,
206
- isPlayingAudio: false,
207
- stopAudio: () => {},
208
- startListening: () => {},
209
- stopListening: () => {},
210
- showMicrophone: true,
211
- microphoneMode: 'CONTINUOUS',
212
- };
213
-
214
- export const ContinuousSpeechListening = Template.bind({});
215
- ContinuousSpeechListening.args = {
216
- dialogState,
217
- userMessage: 'Suspendisse sit amet volutpat velit.',
218
- sendMessage: (msg: string) => console.log(msg),
219
- onTextareaBlur: () => {},
220
- onTextareaFocus: () => {},
221
- onTextareaPressEnter: () => {},
222
- setAttachmentsMenuOpen: () => {},
223
- setSendOnEnter: () => {},
224
- listening: true,
225
- isPlayingAudio: false,
226
- stopAudio: () => {},
227
- startListening: () => {},
228
- stopListening: () => {},
229
- showMicrophone: true,
230
- microphoneMode: 'CONTINUOUS',
231
- };
232
-
233
195
  export const WithUploadButton = Template.bind({});
234
196
  WithUploadButton.args = {
235
197
  showUpload: true,
@@ -0,0 +1,47 @@
1
+ import React from 'react';
2
+ import { render } from '../../testUtils';
3
+ import ChatInputs from './ChatInputs';
4
+ import { dialogState, sessionID } from '../../mocks/data';
5
+
6
+ const baseProps = {
7
+ dialogState,
8
+ sessionID,
9
+ userMessage: '',
10
+ sendOnEnter: 'keypress' as const,
11
+ setSendOnEnter: jest.fn(),
12
+ setAttachmentsMenuOpen: jest.fn(),
13
+ onChangeUserMessage: jest.fn(),
14
+ sendMessage: jest.fn(),
15
+ onTextareaFocus: jest.fn(),
16
+ onTextareaBlur: jest.fn(),
17
+ stopAudio: jest.fn(),
18
+ startListening: jest.fn(),
19
+ stopListening: jest.fn(),
20
+ showMicrophone: true,
21
+ microphoneMode: 'CONTINUOUS' as const,
22
+ };
23
+
24
+ it('disables the microphone while the agent is typing', () => {
25
+ const { container } = render(<ChatInputs {...baseProps} isTyping />);
26
+ const mic = container.querySelector('.memori-chat-inputs--mic-btn');
27
+ expect(mic).toBeDisabled();
28
+ });
29
+
30
+ it('keeps the microphone enabled when the agent is idle', () => {
31
+ const { container } = render(<ChatInputs {...baseProps} isTyping={false} />);
32
+ const mic = container.querySelector('.memori-chat-inputs--mic-btn');
33
+ expect(mic).not.toBeDisabled();
34
+ });
35
+
36
+ it('stops listening when the agent starts typing', () => {
37
+ const stopListening = jest.fn();
38
+ render(
39
+ <ChatInputs
40
+ {...baseProps}
41
+ listening
42
+ isTyping
43
+ stopListening={stopListening}
44
+ />
45
+ );
46
+ expect(stopListening).toHaveBeenCalled();
47
+ });
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useState } from 'react';
1
+ import React, { useCallback, useEffect, useState } from 'react';
2
2
  import { DialogState, Medium } from '@memori.ai/memori-api-client/dist/types';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import ChatTextArea from '../ChatTextArea/ChatTextArea';
@@ -353,7 +353,17 @@ ${text}
353
353
  !hasActiveSession ||
354
354
  ['R2', 'R3', 'R4', 'R5', 'G3', 'X3'].includes(dialogState?.state || '');
355
355
  const microphoneDisabled =
356
- isDisabled || textareaDisabled || !hasActiveSession || !hasChatStarted;
356
+ isDisabled ||
357
+ textareaDisabled ||
358
+ !hasActiveSession ||
359
+ !hasChatStarted ||
360
+ isTyping;
361
+
362
+ useEffect(() => {
363
+ if (isTyping && listening) {
364
+ stopListening();
365
+ }
366
+ }, [isTyping, listening, stopListening]);
357
367
 
358
368
  return (
359
369
  <div className="memori-chat-inputs-wrapper">
@@ -374,6 +384,7 @@ ${text}
374
384
  removeFile={removeFile}
375
385
  showAnonymousRetentionNotice={!authToken}
376
386
  uploadingCount={uploadingCount}
387
+ maxDocumentsPerMessage={maxDocumentsPerMessage}
377
388
  />
378
389
  </div>
379
390
  )}
@@ -187,7 +187,7 @@ button.memori-chat-textarea--expand-button:focus {
187
187
  }
188
188
 
189
189
  [data-theme='dark'] textarea.memori-chat-textarea--input::placeholder {
190
- color: var(--memori-text-color-muted, rgba(255, 255, 255, 0.5));
190
+ color: var(--memori-neutral, rgba(255, 255, 255, 0.5));
191
191
  }
192
192
 
193
193
  /* Layout-scoped dark pills: keep exact text/placeholder colors */
@@ -55,7 +55,7 @@ const getStatusMessage = (status: string): string => {
55
55
  };
56
56
 
57
57
  const meta: Meta = {
58
- title: 'Completion Provider Status',
58
+ title: 'Internals/Completion Provider Status',
59
59
  component: CompletionProviderStatus as React.ComponentType<any>,
60
60
  parameters: {
61
61
  layout: 'centered',
@@ -1,14 +1,5 @@
1
1
  /* ContentPreviewModal – modern preview modal for files and media */
2
-
3
- /*
4
- * @memori.ai/ui Modal uses memori-modal__backdrop (z-index 40) and memori-modal__viewport (z-index 50);
5
- * drawers use z-index 1001. className is applied to the viewport; raise both layers so previews
6
- * stack above chat history and artifact drawers.
7
- */
8
- .memori-modal__backdrop.memori-content-preview-modal-backdrop,
9
- .memori-content-preview-modal.memori-modal__viewport {
10
- z-index: 2147483647 !important;
11
- }
2
+ /* Stacking above drawers: Modal stacking="stacked" (library z-index 1600). */
12
3
 
13
4
  .memori-content-preview-modal.memori-modal__viewport .memori-modal__popup {
14
5
  overflow: hidden;
@@ -32,12 +23,18 @@
32
23
  }
33
24
 
34
25
  .memori-modal__viewport.memori-content-preview-modal .memori-modal__title {
26
+ overflow: hidden;
27
+ min-width: 0;
28
+ max-width: 100%;
35
29
  padding: 1rem 1.25rem 0.75rem;
30
+ padding-right: calc(var(--memori-icon-button-size, 40px) + 1.5rem);
36
31
  border-bottom: 1px solid var(--memori-content-preview-border, rgba(0, 0, 0, 0.06));
37
32
  color: var(--memori-text-color);
38
33
  font-size: var(--memori-text-size-base);
39
34
  font-weight: var(--memori-text-weight-semibold);
40
35
  letter-spacing: -0.01em;
36
+ text-overflow: ellipsis;
37
+ white-space: nowrap;
41
38
  }
42
39
 
43
40
  .memori-modal__viewport.memori-content-preview-modal .memori-modal__close {
@@ -45,28 +42,6 @@
45
42
  right: 0.75rem;
46
43
  }
47
44
 
48
- .memori-modal__viewport.memori-content-preview-modal .memori-modal__close button {
49
- border-radius: var(--memori-radius-box);
50
- background: var(--memori-content-preview-close-bg, rgba(0, 0, 0, 0.05));
51
- color: var(--memori-text-color, #111827);
52
- transition: background 0.2s ease, transform 0.15s ease;
53
- }
54
-
55
- .memori-modal__viewport.memori-content-preview-modal .memori-modal__close button svg {
56
- color: currentColor;
57
- }
58
-
59
- .memori-modal__viewport.memori-content-preview-modal .memori-modal__close button:hover {
60
- background: var(--memori-content-preview-close-hover, rgba(0, 0, 0, 0.1));
61
- transform: scale(1.05);
62
- }
63
-
64
- [data-theme='dark'] .memori-modal__viewport.memori-content-preview-modal .memori-modal__close button,
65
- .memori-widget[data-theme='dark'] .memori-modal__viewport.memori-content-preview-modal .memori-modal__close button {
66
- background: color-mix(in srgb, var(--memori-main-background, #111) 85%, white);
67
- color: var(--memori-text-color, #fff);
68
- }
69
-
70
45
  .memori-content-preview-modal--body--image {
71
46
  display: flex;
72
47
  align-items: center;
@@ -36,7 +36,7 @@ const ContentPreviewModal: FC<ContentPreviewModalProps> = ({
36
36
  onClose={() => onClose()}
37
37
  width={width}
38
38
  widthMd={width}
39
- backdropClassName="memori-content-preview-modal-backdrop"
39
+ stacking="stacked"
40
40
  className={cx('memori-content-preview-modal', className, {
41
41
  'memori-content-preview-modal--image': isImage,
42
42
  })}
@@ -1,10 +1,4 @@
1
1
 
2
- .memori--experts-drawer .memori-drawer--panel {
3
- --memori-drawer--width: 100%;
4
- --memori-drawer--width--md: 60%;
5
- --memori-drawer--width--lg: 40%;
6
- }
7
-
8
2
  h2.memori--experts-drawer--title {
9
3
  margin: 0;
10
4
  font-size: inherit;
@@ -6,7 +6,7 @@ import { tenant, expertReference } from '../../mocks/data';
6
6
  import './ExpertsDrawer.css';
7
7
 
8
8
  const meta: Meta = {
9
- title: 'Widget/ExpertsDrawer',
9
+ title: 'Surfaces/ExpertsDrawer',
10
10
  component: ExpertsDrawer,
11
11
  argTypes: {
12
12
  open: {
@@ -5,22 +5,16 @@ import FeedbackButtons, { Props } from './FeedbackButtons';
5
5
  import { memori } from '../../mocks/data';
6
6
 
7
7
  import './FeedbackButtons.css';
8
- import { AlertProvider } from '@memori.ai/ui';
8
+ import { AlertProvider, AlertViewport } from '@memori.ai/ui';
9
9
 
10
10
  const meta: Meta = {
11
- title: 'Feedback Buttons',
11
+ title: 'Internals/Feedback Buttons',
12
12
  component: FeedbackButtons,
13
13
  argTypes: {},
14
14
  parameters: {
15
15
  controls: { expanded: true },
16
+ layout: 'centered',
16
17
  },
17
- decorators: [
18
- Story => (
19
- <div style={{ textAlign: 'right', padding: '0 3rem' }}>
20
- <Story />
21
- </div>
22
- ),
23
- ],
24
18
  };
25
19
 
26
20
  export default meta;
@@ -28,7 +22,32 @@ export default meta;
28
22
  const Template: Story<Props> = args => (
29
23
  <I18nWrapper>
30
24
  <AlertProvider defaultDuration={5000}>
31
- <FeedbackButtons {...args} />
25
+ <div
26
+ style={{
27
+ display: 'flex',
28
+ alignItems: 'center',
29
+ justifyContent: 'center',
30
+ width: '100%',
31
+ height: '100%',
32
+ }}
33
+ >
34
+ <div
35
+ style={{
36
+ display: 'inline-flex',
37
+ flex: 'none',
38
+ alignItems: 'center',
39
+ padding: '6px 10px',
40
+ borderRadius: 999,
41
+ background:
42
+ 'color-mix(in srgb, var(--memori-main-background, #fff) 92%, transparent)',
43
+ boxShadow:
44
+ '0 4px 16px color-mix(in srgb, var(--memori-text-color, #111827) 18%, transparent)',
45
+ }}
46
+ >
47
+ <FeedbackButtons {...args} />
48
+ </div>
49
+ </div>
50
+ <AlertViewport />
32
51
  </AlertProvider>
33
52
  </I18nWrapper>
34
53
  );
@@ -1,6 +1,7 @@
1
1
  /* Updated FilePreview Styles */
2
2
 
3
3
  .memori--preview-container {
4
+ position: relative;
4
5
  z-index: 10;
5
6
  overflow: hidden;
6
7
  width: 100%;
@@ -12,6 +13,46 @@
12
13
  transition: all 0.3s ease;
13
14
  }
14
15
 
16
+ .memori--preview-list {
17
+ display: flex;
18
+ width: 100%;
19
+ min-width: 0;
20
+ max-width: 100%;
21
+ box-sizing: border-box;
22
+ flex-direction: row;
23
+ flex-wrap: nowrap;
24
+ padding: 0.875rem;
25
+ padding-bottom: 0.625rem;
26
+ gap: 8px;
27
+ -webkit-overflow-scrolling: touch;
28
+ overflow-x: auto;
29
+ overflow-y: hidden;
30
+ overscroll-behavior-x: contain;
31
+ scrollbar-color: hsla(var(--border-300) / 35%) transparent;
32
+ scrollbar-width: thin;
33
+ touch-action: pan-x;
34
+ }
35
+
36
+ .memori--document-count {
37
+ position: absolute;
38
+ z-index: 5;
39
+ top: 8px;
40
+ right: 8px;
41
+ padding: calc(var(--memori-spacing-xs) / 4) calc(var(--memori-spacing-xs) + 2px);
42
+ border-radius: var(--memori-radius-box);
43
+ color: var(--memori-text-color);
44
+ font-size: 12px;
45
+ font-weight: bold;
46
+ }
47
+
48
+ .memori--document-count-full {
49
+ background-color: #fa5252;
50
+ }
51
+
52
+ .memori--preview-container:has(.memori--document-count) .memori--preview-list {
53
+ padding-right: 2.75rem;
54
+ }
55
+
15
56
  .memori--preview-container.slide-down {
16
57
  animation: slide-down 0.3s ease;
17
58
  }
@@ -106,26 +147,6 @@
106
147
  margin: calc(var(--memori-spacing-sm) + var(--memori-spacing-xs)) 0;
107
148
  }
108
149
 
109
- .memori--preview-list {
110
- display: flex;
111
- width: 100%;
112
- min-width: 0;
113
- max-width: 100%;
114
- box-sizing: border-box;
115
- flex-direction: row;
116
- flex-wrap: nowrap;
117
- padding: 0.875rem;
118
- padding-bottom: 0.625rem;
119
- gap: 8px;
120
- -webkit-overflow-scrolling: touch;
121
- overflow-x: auto;
122
- overflow-y: hidden;
123
- overscroll-behavior-x: contain;
124
- scrollbar-color: hsla(var(--border-300) / 35%) transparent;
125
- scrollbar-width: thin;
126
- touch-action: pan-x;
127
- }
128
-
129
150
  .memori--preview-item {
130
151
  position: relative;
131
152
  display: flex;
@@ -11,6 +11,8 @@ import {
11
11
  } from '../../helpers/utils';
12
12
  import { getDocumentBadgeLabel } from '../MediaWidget/MediaItemWidget.utils';
13
13
  import { useTranslation } from 'react-i18next';
14
+ import cx from 'classnames';
15
+ import { maxDocumentsPerMessage as defaultMaxDocumentsPerMessage } from '../../helpers/constants';
14
16
 
15
17
  type FilePreviewProps = {
16
18
  previewFiles: any;
@@ -18,6 +20,7 @@ type FilePreviewProps = {
18
20
  allowRemove?: boolean;
19
21
  showAnonymousRetentionNotice?: boolean;
20
22
  uploadingCount?: number;
23
+ maxDocumentsPerMessage?: number;
21
24
  };
22
25
 
23
26
  const FilePreview = ({
@@ -26,6 +29,7 @@ const FilePreview = ({
26
29
  allowRemove = true,
27
30
  showAnonymousRetentionNotice = false,
28
31
  uploadingCount = 0,
32
+ maxDocumentsPerMessage = defaultMaxDocumentsPerMessage,
29
33
  }: FilePreviewProps) => {
30
34
  const { t } = useTranslation();
31
35
  const [selectedFile, setSelectedFile] = useState<{
@@ -152,6 +156,16 @@ const FilePreview = ({
152
156
  <>
153
157
  {(previewFiles.length > 0 || uploadingCount > 0) && (
154
158
  <div className="memori--preview-container">
159
+ {previewFiles.length > 0 && (
160
+ <div
161
+ className={cx('memori--document-count', {
162
+ 'memori--document-count-full':
163
+ previewFiles.length >= maxDocumentsPerMessage,
164
+ })}
165
+ >
166
+ {previewFiles.length}/{maxDocumentsPerMessage}
167
+ </div>
168
+ )}
155
169
  {showAnonymousRetentionNotice && (
156
170
  <small
157
171
  style={{
@@ -7,6 +7,13 @@ exports[`renders FilePreview with one file 1`] = `
7
7
  <div
8
8
  class="memori--preview-container"
9
9
  >
10
+ <div
11
+ class="memori--document-count"
12
+ >
13
+ 1
14
+ /
15
+ 10
16
+ </div>
10
17
  <div
11
18
  class="memori--preview-list"
12
19
  >
@@ -95,6 +102,13 @@ exports[`renders FilePreview with two files 1`] = `
95
102
  <div
96
103
  class="memori--preview-container"
97
104
  >
105
+ <div
106
+ class="memori--document-count"
107
+ >
108
+ 2
109
+ /
110
+ 10
111
+ </div>
98
112
  <div
99
113
  class="memori--preview-list"
100
114
  >