@memori.ai/memori-react 9.0.0-alpha.21 → 9.0.0-alpha.23

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 (283) hide show
  1. package/CHANGELOG.md +453 -0
  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/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  10. package/dist/components/Chat/Chat.css +1 -0
  11. package/dist/components/Chat/Chat.js +1 -1
  12. package/dist/components/Chat/Chat.js.map +1 -1
  13. package/dist/components/ChatBubble/ChatBubble.css +32 -5
  14. package/dist/components/ChatBubble/ChatBubble.js +14 -11
  15. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  16. package/dist/components/ChatHistoryDrawer/ChatHistory.d.ts +3 -1
  17. package/dist/components/ChatHistoryDrawer/ChatHistory.js +2 -2
  18. package/dist/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  19. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  20. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.d.ts +3 -1
  21. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.js +7 -57
  22. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  23. package/dist/components/ChatInputs/ChatInputs.js +10 -1
  24. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  25. package/dist/components/ChatTextArea/ChatTextArea.css +1 -1
  26. package/dist/components/ContentPreviewModal/ContentPreviewModal.css +1 -10
  27. package/dist/components/ContentPreviewModal/ContentPreviewModal.js +1 -1
  28. package/dist/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  29. package/dist/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  30. package/dist/components/FeedbackButtons/FeedbackButtons.js +2 -2
  31. package/dist/components/FeedbackButtons/FeedbackButtons.js.map +1 -1
  32. package/dist/components/Header/Header.css +8 -3
  33. package/dist/components/Header/Header.js +15 -18
  34. package/dist/components/Header/Header.js.map +1 -1
  35. package/dist/components/IconButton/IconButton.d.ts +1 -1
  36. package/dist/components/KnownFacts/KnownFacts.css +1 -1
  37. package/dist/components/KnownFacts/KnownFacts.js +2 -5
  38. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  39. package/dist/components/LoginDrawer/LoginDrawer.css +16 -14
  40. package/dist/components/LoginDrawer/LoginDrawer.js +19 -11
  41. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  42. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +4 -4
  43. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +28 -5
  44. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -2
  45. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  46. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +1 -1
  47. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  48. package/dist/components/MemoriWidget/MemoriWidget.d.ts +1 -0
  49. package/dist/components/MemoriWidget/MemoriWidget.js +93 -32
  50. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  51. package/dist/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  52. package/dist/components/PositionPopover/PositionPopover.css +3 -3
  53. package/dist/components/PositionPopover/PositionPopover.js +38 -25
  54. package/dist/components/PositionPopover/PositionPopover.js.map +1 -1
  55. package/dist/components/Snippet/Snippet.css +1 -1
  56. package/dist/components/StartPanel/StartPanel.css +19 -3
  57. package/dist/components/StartPanel/StartPanel.js +12 -18
  58. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  59. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  60. package/dist/components/layouts/chat.css +5 -2
  61. package/dist/components/layouts/totem.css +43 -9
  62. package/dist/helpers/nats/getNatsConfig.js.map +1 -1
  63. package/dist/helpers/nats/useNats.d.ts +2 -1
  64. package/dist/helpers/nats/useNats.js +87 -20
  65. package/dist/helpers/nats/useNats.js.map +1 -1
  66. package/dist/helpers/nats/useNatsSession.d.ts +6 -1
  67. package/dist/helpers/nats/useNatsSession.js +48 -7
  68. package/dist/helpers/nats/useNatsSession.js.map +1 -1
  69. package/dist/helpers/positionPopover.d.ts +2 -1
  70. package/dist/helpers/positionPopover.js +10 -2
  71. package/dist/helpers/positionPopover.js.map +1 -1
  72. package/dist/icons/MemoriIcon.js +1 -1
  73. package/dist/icons/MemoriIcon.js.map +1 -1
  74. package/dist/locales/de.json +4 -1
  75. package/dist/locales/en.json +3 -1
  76. package/dist/locales/es.json +3 -1
  77. package/dist/locales/fr.json +3 -1
  78. package/dist/locales/it.json +3 -1
  79. package/dist/styles.css +1 -1
  80. package/dist/version.d.ts +1 -1
  81. package/dist/version.js +1 -1
  82. package/esm/components/AgeVerificationModal/AgeVerificationModal.css +1 -7
  83. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +1 -1
  84. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  85. package/esm/components/Auth/Auth.css +12 -5
  86. package/esm/components/Auth/Auth.d.ts +1 -1
  87. package/esm/components/Auth/Auth.js +47 -33
  88. package/esm/components/Auth/Auth.js.map +1 -1
  89. package/esm/components/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  90. package/esm/components/Chat/Chat.css +1 -0
  91. package/esm/components/Chat/Chat.js +1 -1
  92. package/esm/components/Chat/Chat.js.map +1 -1
  93. package/esm/components/ChatBubble/ChatBubble.css +32 -5
  94. package/esm/components/ChatBubble/ChatBubble.js +14 -11
  95. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  96. package/esm/components/ChatHistoryDrawer/ChatHistory.d.ts +3 -1
  97. package/esm/components/ChatHistoryDrawer/ChatHistory.js +2 -2
  98. package/esm/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  99. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  100. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.d.ts +3 -1
  101. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js +9 -59
  102. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  103. package/esm/components/ChatInputs/ChatInputs.js +11 -2
  104. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  105. package/esm/components/ChatTextArea/ChatTextArea.css +1 -1
  106. package/esm/components/ContentPreviewModal/ContentPreviewModal.css +1 -10
  107. package/esm/components/ContentPreviewModal/ContentPreviewModal.js +1 -1
  108. package/esm/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  109. package/esm/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  110. package/esm/components/FeedbackButtons/FeedbackButtons.js +2 -2
  111. package/esm/components/FeedbackButtons/FeedbackButtons.js.map +1 -1
  112. package/esm/components/Header/Header.css +8 -3
  113. package/esm/components/Header/Header.js +15 -18
  114. package/esm/components/Header/Header.js.map +1 -1
  115. package/esm/components/IconButton/IconButton.d.ts +1 -1
  116. package/esm/components/KnownFacts/KnownFacts.css +1 -1
  117. package/esm/components/KnownFacts/KnownFacts.js +2 -5
  118. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  119. package/esm/components/LoginDrawer/LoginDrawer.css +16 -14
  120. package/esm/components/LoginDrawer/LoginDrawer.js +20 -12
  121. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  122. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +4 -4
  123. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +28 -5
  124. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -2
  125. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  126. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +1 -1
  127. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  128. package/esm/components/MemoriWidget/MemoriWidget.d.ts +1 -0
  129. package/esm/components/MemoriWidget/MemoriWidget.js +93 -33
  130. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  131. package/esm/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  132. package/esm/components/PositionPopover/PositionPopover.css +3 -3
  133. package/esm/components/PositionPopover/PositionPopover.js +39 -26
  134. package/esm/components/PositionPopover/PositionPopover.js.map +1 -1
  135. package/esm/components/Snippet/Snippet.css +1 -1
  136. package/esm/components/StartPanel/StartPanel.css +19 -3
  137. package/esm/components/StartPanel/StartPanel.js +12 -18
  138. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  139. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  140. package/esm/components/layouts/chat.css +5 -2
  141. package/esm/components/layouts/totem.css +43 -9
  142. package/esm/helpers/nats/getNatsConfig.js.map +1 -1
  143. package/esm/helpers/nats/useNats.d.ts +2 -1
  144. package/esm/helpers/nats/useNats.js +87 -20
  145. package/esm/helpers/nats/useNats.js.map +1 -1
  146. package/esm/helpers/nats/useNatsSession.d.ts +6 -1
  147. package/esm/helpers/nats/useNatsSession.js +48 -8
  148. package/esm/helpers/nats/useNatsSession.js.map +1 -1
  149. package/esm/helpers/positionPopover.d.ts +2 -1
  150. package/esm/helpers/positionPopover.js +9 -2
  151. package/esm/helpers/positionPopover.js.map +1 -1
  152. package/esm/icons/MemoriIcon.js +1 -1
  153. package/esm/icons/MemoriIcon.js.map +1 -1
  154. package/esm/locales/de.json +4 -1
  155. package/esm/locales/en.json +3 -1
  156. package/esm/locales/es.json +3 -1
  157. package/esm/locales/fr.json +3 -1
  158. package/esm/locales/it.json +3 -1
  159. package/esm/styles.css +1 -1
  160. package/esm/version.d.ts +1 -1
  161. package/esm/version.js +1 -1
  162. package/package.json +8 -5
  163. package/src/Live/Agents.stories.tsx +49 -0
  164. package/src/Live/KnownFacts.stories.tsx +50 -0
  165. package/src/Showcase.stories.tsx +3 -14
  166. package/src/components/AgeVerificationModal/AgeVerificationModal.css +1 -7
  167. package/src/components/AgeVerificationModal/AgeVerificationModal.stories.tsx +1 -1
  168. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +1 -0
  169. package/src/components/Auth/Auth.css +12 -5
  170. package/src/components/Auth/Auth.stories.tsx +1 -1
  171. package/src/components/Auth/Auth.test.tsx +68 -1
  172. package/src/components/Auth/Auth.tsx +69 -54
  173. package/src/components/Auth/__snapshots__/Auth.test.tsx.snap +5 -6
  174. package/src/components/Avatar/Avatar.stories.tsx +1 -18
  175. package/src/components/Avatar/AvatarView/AvatarView.stories.tsx +1 -103
  176. package/src/components/Blob/Blob.stories.tsx +1 -1
  177. package/src/components/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  178. package/src/components/BlockedMemoriBadge/BlockedMemoriBadge.stories.tsx +1 -1
  179. package/src/components/ChangeMode/ChangeMode.stories.tsx +1 -1
  180. package/src/components/Chat/Chat.css +1 -0
  181. package/src/components/Chat/Chat.stories.tsx +61 -7
  182. package/src/components/Chat/Chat.tsx +1 -0
  183. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +151 -151
  184. package/src/components/ChatBubble/ChatBubble.css +32 -5
  185. package/src/components/ChatBubble/ChatBubble.stories.tsx +24 -2
  186. package/src/components/ChatBubble/ChatBubble.test.tsx +37 -1
  187. package/src/components/ChatBubble/ChatBubble.tsx +308 -299
  188. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +384 -264
  189. package/src/components/ChatHistoryDrawer/ChatHistory.stories.tsx +1 -1
  190. package/src/components/ChatHistoryDrawer/ChatHistory.tsx +6 -0
  191. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  192. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.tsx +24 -81
  193. package/src/components/ChatInputs/ChatInputs.stories.tsx +1 -39
  194. package/src/components/ChatInputs/ChatInputs.test.tsx +47 -0
  195. package/src/components/ChatInputs/ChatInputs.tsx +12 -2
  196. package/src/components/ChatTextArea/ChatTextArea.css +1 -1
  197. package/src/components/CompletionProviderStatus/CompletionProviderStatus.stories.tsx +1 -1
  198. package/src/components/ContentPreviewModal/ContentPreviewModal.css +1 -10
  199. package/src/components/ContentPreviewModal/ContentPreviewModal.tsx +1 -1
  200. package/src/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  201. package/src/components/ExpertsDrawer/ExpertsDrawer.stories.tsx +1 -1
  202. package/src/components/FeedbackButtons/FeedbackButtons.stories.tsx +29 -10
  203. package/src/components/FeedbackButtons/FeedbackButtons.tsx +2 -0
  204. package/src/components/FeedbackButtons/__snapshots__/FeedbackButtons.test.tsx.snap +1 -1
  205. package/src/components/Header/Header.css +8 -3
  206. package/src/components/Header/Header.stories.tsx +1 -1
  207. package/src/components/Header/Header.tsx +146 -117
  208. package/src/components/KnownFacts/KnownFacts.css +1 -1
  209. package/src/components/KnownFacts/KnownFacts.stories.tsx +1 -23
  210. package/src/components/KnownFacts/KnownFacts.tsx +4 -9
  211. package/src/components/KnownFacts/__snapshots__/KnownFacts.test.tsx.snap +6 -2
  212. package/src/components/LoginDrawer/LoginDrawer.css +16 -14
  213. package/src/components/LoginDrawer/LoginDrawer.stories.tsx +2 -52
  214. package/src/components/LoginDrawer/LoginDrawer.tsx +51 -39
  215. package/src/components/LoginDrawer/__snapshots__/LoginDrawer.test.tsx.snap +33 -11
  216. package/src/components/MediaWidget/MediaItemWidget.stories.tsx +1 -15
  217. package/src/components/MediaWidget/MediaWidget.stories.tsx +1 -45
  218. package/src/components/MemoriArtifactSystem/components/ArtifactActions/CopyButton.stories.tsx +1 -1
  219. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +4 -4
  220. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +28 -5
  221. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +4 -6
  222. package/src/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.tsx +1 -1
  223. package/src/components/MemoriArtifactSystem/utils/ArtifactAPI.test.tsx +32 -28
  224. package/src/components/MemoriWidget/MemoriUIProvider.contract.test.tsx +55 -0
  225. package/src/components/MemoriWidget/MemoriWidget.stories.tsx +55 -77
  226. package/src/components/MemoriWidget/MemoriWidget.tsx +114 -45
  227. package/src/components/MemoriWidget/getChatStyles.test.ts +24 -0
  228. package/src/components/MicrophoneButton/MicrophoneButton.stories.tsx +1 -1
  229. package/src/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  230. package/src/components/PositionPopover/PositionPopover.css +3 -3
  231. package/src/components/PositionPopover/PositionPopover.stories.tsx +1 -1
  232. package/src/components/PositionPopover/PositionPopover.tsx +50 -28
  233. package/src/components/PoweredBy/PoweredBy.stories.tsx +1 -54
  234. package/src/components/PoweredBy/__snapshots__/PoweredBy.test.tsx.snap +2 -2
  235. package/src/components/SendOnEnterMenu/SendOnEnterMenu.stories.tsx +1 -1
  236. package/src/components/SettingsDrawer/SettingsDrawer.stories.tsx +1 -1
  237. package/src/components/ShareButton/ShareButton.stories.tsx +1 -1
  238. package/src/components/Snippet/Snippet.css +1 -1
  239. package/src/components/Snippet/Snippet.stories.tsx +1 -1
  240. package/src/components/StartPanel/StartPanel.css +19 -3
  241. package/src/components/StartPanel/StartPanel.stories.tsx +2 -2
  242. package/src/components/StartPanel/StartPanel.tsx +22 -35
  243. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +177 -121
  244. package/src/components/Typing/Typing.stories.tsx +1 -1
  245. package/src/components/WhyThisAnswer/WhyThisAnswer.stories.tsx +22 -44
  246. package/src/components/WhyThisAnswer/__snapshots__/WhyThisAnswer.test.tsx.snap +9 -3
  247. package/src/components/layouts/FullBody/FullBody.stories.tsx +55 -68
  248. package/src/components/layouts/Totem/Totem.stories.tsx +69 -87
  249. package/src/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  250. package/src/components/layouts/ZoomedFullBody/ZoomedFullBody.stories.tsx +69 -87
  251. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +19 -41
  252. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +39 -83
  253. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +15 -11
  254. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +116 -42
  255. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +18 -40
  256. package/src/components/layouts/chat.css +5 -2
  257. package/src/components/layouts/layouts.stories.tsx +96 -179
  258. package/src/components/layouts/totem.css +43 -9
  259. package/src/helpers/nats/getNatsConfig.ts +4 -1
  260. package/src/helpers/nats/useNats.test.tsx +81 -0
  261. package/src/helpers/nats/useNats.ts +109 -29
  262. package/src/helpers/nats/useNatsSession.test.ts +16 -0
  263. package/src/helpers/nats/useNatsSession.ts +79 -13
  264. package/src/helpers/positionPopover.test.ts +36 -1
  265. package/src/helpers/positionPopover.ts +21 -4
  266. package/src/i18n.knownFacts.test.ts +40 -0
  267. package/src/icons/MemoriIcon.tsx +1 -1
  268. package/src/index.stories.tsx +1 -47
  269. package/src/locales/de.json +4 -1
  270. package/src/locales/en.json +3 -1
  271. package/src/locales/es.json +3 -1
  272. package/src/locales/fr.json +3 -1
  273. package/src/locales/it.json +3 -1
  274. package/src/styles.css +13 -27
  275. package/src/version.ts +1 -1
  276. package/src/components/ChatTextArea/ChatTextArea.stories.tsx +0 -55
  277. package/src/components/CustomGLBModelViewer/ModelViewer.stories.tsx +0 -58
  278. package/src/components/DateSelector/DateSelector.stories.tsx +0 -47
  279. package/src/components/FilePreview/FilePreview.stories.tsx +0 -63
  280. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +0 -265
  281. package/src/components/UploadButton/UploadButton.stories.tsx +0 -510
  282. package/src/components/VenueWidget/VenueWidget.stories.tsx +0 -69
  283. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.stories.tsx +0 -115
@@ -9,6 +9,7 @@ import {
9
9
  createAlertOptions,
10
10
  Card,
11
11
  Form,
12
+ Field,
12
13
  } from '@memori.ai/ui';
13
14
  import { useTranslation } from 'react-i18next';
14
15
  import { useWidgetSurfaceEl } from '../../context/widgetSurfaceContext';
@@ -107,9 +108,9 @@ const LoginDrawer = ({
107
108
  // OTP timer effect
108
109
  useEffect(() => {
109
110
  let interval: NodeJS.Timeout;
110
- if (otpTimer && otpTimer > 0) {
111
+ if (otpTimer != null && otpTimer > 0) {
111
112
  interval = setInterval(() => {
112
- setOtpTimer(prev => (prev && prev > 0 ? prev - 1 : 0));
113
+ setOtpTimer(prev => (prev != null && prev > 0 ? prev - 1 : 0));
113
114
  }, 1000);
114
115
  }
115
116
  return () => {
@@ -117,6 +118,14 @@ const LoginDrawer = ({
117
118
  };
118
119
  }, [otpTimer]);
119
120
 
121
+ useEffect(() => {
122
+ if (otpTimer !== 0) return;
123
+ setOtpTimer(null);
124
+ if (!otpSuccess) {
125
+ setOtpError(t('login.otpExpired'));
126
+ }
127
+ }, [otpTimer, otpSuccess, t]);
128
+
120
129
  useEffect(() => {
121
130
  const mediaQuery = window.matchMedia('(max-width: 768px)');
122
131
  const onChange = () => setIsMobileViewport(mediaQuery.matches);
@@ -459,34 +468,34 @@ const LoginDrawer = ({
459
468
  onSubmit={updateMissingData}
460
469
  >
461
470
  {needsMissingData.birthDate && (
462
- <>
463
- <label htmlFor="#birthDate">
471
+ <Field.Root className="memori--login-drawer--field">
472
+ <Field.Label htmlFor="birthDate">
464
473
  {t('login.birthDate')}
465
- <Input
466
- id="birthDate"
467
- name="birthDate"
468
- type={
469
- isMobileViewport && !birthDate && !isBirthDateFocused
470
- ? 'text'
471
- : 'date'
472
- }
473
- required
474
- onChange={e => setBirthDate(e.target.value)}
475
- value={birthDate}
476
- placeholder={
477
- isMobileViewport
478
- ? t('login.birthDatePlaceholder') || 'DD/MM/YYYY'
479
- : undefined
480
- }
481
- onFocus={() => setIsBirthDateFocused(true)}
482
- onBlur={() => setIsBirthDateFocused(false)}
483
- autoComplete="bday"
484
- />
485
- </label>
486
- <p>
487
- <small>{t('login.birthDateHelper')}</small>
488
- </p>
489
- </>
474
+ </Field.Label>
475
+ <Input
476
+ id="birthDate"
477
+ name="birthDate"
478
+ type={
479
+ isMobileViewport && !birthDate && !isBirthDateFocused
480
+ ? 'text'
481
+ : 'date'
482
+ }
483
+ required
484
+ onChange={e => setBirthDate(e.target.value)}
485
+ value={birthDate}
486
+ placeholder={
487
+ isMobileViewport
488
+ ? t('login.birthDatePlaceholder') || 'DD/MM/YYYY'
489
+ : undefined
490
+ }
491
+ onFocus={() => setIsBirthDateFocused(true)}
492
+ onBlur={() => setIsBirthDateFocused(false)}
493
+ autoComplete="bday"
494
+ />
495
+ <Field.Description>
496
+ {t('login.birthDateHelper')}
497
+ </Field.Description>
498
+ </Field.Root>
490
499
  )}
491
500
 
492
501
  {needsMissingData?.tnCAndPPAccepted && (
@@ -638,7 +647,7 @@ const LoginDrawer = ({
638
647
  </div>
639
648
  )}
640
649
 
641
- {otpTimer && otpTimer > 0 && !otpSuccess && (
650
+ {otpTimer != null && otpTimer > 0 && !otpSuccess && (
642
651
  <div className="memori--login-drawer--otp-timer">
643
652
  {/* <span className="memori--login-drawer--otp-timer-icon">⏱️</span> */}
644
653
  <span>{t('login.otpTimer', { seconds: otpTimer })}</span>
@@ -666,7 +675,7 @@ const LoginDrawer = ({
666
675
  disabled={
667
676
  loading ||
668
677
  isResending ||
669
- (otpTimer && otpTimer > 0) ||
678
+ (otpTimer != null && otpTimer > 0) ||
670
679
  !otpEmail
671
680
  }
672
681
  loading={isResending}
@@ -706,13 +715,15 @@ const LoginDrawer = ({
706
715
  {t('login.otpEmailDescription')}
707
716
  </p>
708
717
  <div className={cx('memori--login-drawer--otp-form', { loading })}>
709
- <label
710
- htmlFor="otp-email"
711
- className="memori--login-drawer--otp-label"
712
- >
713
- <span className="memori--login-drawer--otp-label-text">
714
- {t('login.email')}
715
- </span>
718
+ <Field.Root className="memori--login-drawer--otp-field">
719
+ <Field.Label
720
+ htmlFor="otp-email"
721
+ className="memori--login-drawer--otp-label"
722
+ >
723
+ <span className="memori--login-drawer--otp-label-text">
724
+ {t('login.email')}
725
+ </span>
726
+ </Field.Label>
716
727
  <div className="memori--login-drawer--otp-input-container">
717
728
  <Input
718
729
  id="otp-email"
@@ -743,7 +754,8 @@ const LoginDrawer = ({
743
754
  </div>
744
755
  )}
745
756
  </div>
746
- </label>
757
+ {otpError ? <Field.Error>{otpError}</Field.Error> : null}
758
+ </Field.Root>
747
759
  </div>
748
760
 
749
761
  <div className="memori--login-drawer--otp-actions memori--login-drawer--otp-actions-primary">
@@ -15,7 +15,9 @@ exports[`renders LoginDrawer closed unchanged 1`] = `
15
15
  `;
16
16
 
17
17
  exports[`renders LoginDrawer logged in unchanged 1`] = `
18
- <div>
18
+ <div
19
+ data-base-ui-inert=""
20
+ >
19
21
  <div
20
22
  aria-atomic="false"
21
23
  aria-label="Notifications"
@@ -29,7 +31,9 @@ exports[`renders LoginDrawer logged in unchanged 1`] = `
29
31
  `;
30
32
 
31
33
  exports[`renders LoginDrawer logged with missing data unchanged 1`] = `
32
- <div>
34
+ <div
35
+ data-base-ui-inert=""
36
+ >
33
37
  <div
34
38
  aria-atomic="false"
35
39
  aria-label="Notifications"
@@ -43,7 +47,9 @@ exports[`renders LoginDrawer logged with missing data unchanged 1`] = `
43
47
  `;
44
48
 
45
49
  exports[`renders LoginDrawer on change password unchanged 1`] = `
46
- <div>
50
+ <div
51
+ data-base-ui-inert=""
52
+ >
47
53
  <div
48
54
  aria-atomic="false"
49
55
  aria-label="Notifications"
@@ -57,7 +63,9 @@ exports[`renders LoginDrawer on change password unchanged 1`] = `
57
63
  `;
58
64
 
59
65
  exports[`renders LoginDrawer on signup unchanged 1`] = `
60
- <div>
66
+ <div
67
+ data-base-ui-inert=""
68
+ >
61
69
  <div
62
70
  aria-atomic="false"
63
71
  aria-label="Notifications"
@@ -71,7 +79,9 @@ exports[`renders LoginDrawer on signup unchanged 1`] = `
71
79
  `;
72
80
 
73
81
  exports[`renders LoginDrawer on signup waiting for otp unchanged 1`] = `
74
- <div>
82
+ <div
83
+ data-base-ui-inert=""
84
+ >
75
85
  <div
76
86
  aria-atomic="false"
77
87
  aria-label="Notifications"
@@ -85,7 +95,9 @@ exports[`renders LoginDrawer on signup waiting for otp unchanged 1`] = `
85
95
  `;
86
96
 
87
97
  exports[`renders LoginDrawer open unchanged 1`] = `
88
- <div>
98
+ <div
99
+ data-base-ui-inert=""
100
+ >
89
101
  <div
90
102
  aria-atomic="false"
91
103
  aria-label="Notifications"
@@ -99,7 +111,9 @@ exports[`renders LoginDrawer open unchanged 1`] = `
99
111
  `;
100
112
 
101
113
  exports[`renders LoginDrawer unlogged unchanged 1`] = `
102
- <div>
114
+ <div
115
+ data-base-ui-inert=""
116
+ >
103
117
  <div
104
118
  aria-atomic="false"
105
119
  aria-label="Notifications"
@@ -113,7 +127,9 @@ exports[`renders LoginDrawer unlogged unchanged 1`] = `
113
127
  `;
114
128
 
115
129
  exports[`renders LoginDrawer with OTP form and error unchanged 1`] = `
116
- <div>
130
+ <div
131
+ data-base-ui-inert=""
132
+ >
117
133
  <div
118
134
  aria-atomic="false"
119
135
  aria-label="Notifications"
@@ -127,7 +143,9 @@ exports[`renders LoginDrawer with OTP form and error unchanged 1`] = `
127
143
  `;
128
144
 
129
145
  exports[`renders LoginDrawer with OTP form and timer unchanged 1`] = `
130
- <div>
146
+ <div
147
+ data-base-ui-inert=""
148
+ >
131
149
  <div
132
150
  aria-atomic="false"
133
151
  aria-label="Notifications"
@@ -141,7 +159,9 @@ exports[`renders LoginDrawer with OTP form and timer unchanged 1`] = `
141
159
  `;
142
160
 
143
161
  exports[`renders LoginDrawer with OTP form loading unchanged 1`] = `
144
- <div>
162
+ <div
163
+ data-base-ui-inert=""
164
+ >
145
165
  <div
146
166
  aria-atomic="false"
147
167
  aria-label="Notifications"
@@ -155,7 +175,9 @@ exports[`renders LoginDrawer with OTP form loading unchanged 1`] = `
155
175
  `;
156
176
 
157
177
  exports[`renders LoginDrawer with OTP form unchanged 1`] = `
158
- <div>
178
+ <div
179
+ data-base-ui-inert=""
180
+ >
159
181
  <div
160
182
  aria-atomic="false"
161
183
  aria-label="Notifications"
@@ -6,7 +6,7 @@ import MediaItemWidget, { Props } from './MediaItemWidget';
6
6
  import './MediaItemWidget.css';
7
7
 
8
8
  const meta: Meta = {
9
- title: 'Media Widget/Media',
9
+ title: 'Internals/Media',
10
10
  component: MediaItemWidget,
11
11
  argTypes: {
12
12
  translateTo: {
@@ -55,20 +55,6 @@ Default.args = {
55
55
  content:
56
56
  'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf',
57
57
  },
58
- {
59
- mediumID: '95226d7e-7bae-465e-8b80-995587bb5974',
60
- mimeType: 'video/mp4',
61
- title: 'Video',
62
- url: 'https://www.w3schools.com/html/mov_bbb.mp4',
63
- content: 'https://www.w3schools.com/html/mov_bbb.mp4',
64
- },
65
- {
66
- mediumID: '95226d7e-7bae-465e-8b80-995587bb5975',
67
- mimeType: 'audio/mpeg',
68
- title: 'Audio',
69
- url: 'https://www.w3schools.com/html/horse.mp3',
70
- content: 'https://www.w3schools.com/html/horse.mp3',
71
- },
72
58
  {
73
59
  mediumID: '95226d7e-7bae-465e-8b80-995587bb5976',
74
60
  mimeType: 'application/msword',
@@ -10,7 +10,7 @@ import {
10
10
  import './MediaWidget.css';
11
11
 
12
12
  const meta: Meta = {
13
- title: 'Media Widget/Wrapper',
13
+ title: 'Internals/Media Wrapper',
14
14
  component: MediaWidget,
15
15
  argTypes: {
16
16
  hints: {
@@ -153,50 +153,6 @@ AllMediaTypes.args = {
153
153
  title: 'GIF Image',
154
154
  url: 'https://picsum.photos/300/200?random=4',
155
155
  },
156
- // Videos
157
- {
158
- mediumID: 'video-mp4-1',
159
- mimeType: 'video/mp4',
160
- title: 'MP4 Video',
161
- url: 'https://www.w3schools.com/html/mov_bbb.mp4',
162
- },
163
- {
164
- mediumID: 'video-quicktime-1',
165
- mimeType: 'video/quicktime',
166
- title: 'QuickTime Video',
167
- url: 'https://www.w3schools.com/html/mov_bbb.mp4',
168
- },
169
- {
170
- mediumID: 'video-avi-1',
171
- mimeType: 'video/avi',
172
- title: 'AVI Video',
173
- url: 'https://www.w3schools.com/html/mov_bbb.mp4',
174
- },
175
- {
176
- mediumID: 'video-mpeg-1',
177
- mimeType: 'video/mpeg',
178
- title: 'MPEG Video',
179
- url: 'https://www.w3schools.com/html/mov_bbb.mp4',
180
- },
181
- // Audio
182
- {
183
- mediumID: 'audio-mpeg-1',
184
- mimeType: 'audio/mpeg',
185
- title: 'MPEG Audio',
186
- url: 'https://www.w3schools.com/html/horse.mp3',
187
- },
188
- {
189
- mediumID: 'audio-mpeg3-1',
190
- mimeType: 'audio/mpeg3',
191
- title: 'MPEG3 Audio',
192
- url: 'https://www.w3schools.com/html/horse.mp3',
193
- },
194
- {
195
- mediumID: 'audio-wav-1',
196
- mimeType: 'audio/wav',
197
- title: 'WAV Audio',
198
- url: 'https://www.w3schools.com/html/horse.mp3',
199
- },
200
156
  // Documents
201
157
  {
202
158
  mediumID: 'doc-pdf-1',
@@ -10,7 +10,7 @@ import CopyButtonTest from './test/CopyButtonTest';
10
10
 
11
11
 
12
12
  const meta: Meta<typeof CopyButtonTest> = {
13
- title: 'Artifact System/CopyButtonTest',
13
+ title: 'Internals/CopyButtonTest',
14
14
  component: CopyButtonTest,
15
15
  parameters: {
16
16
  layout: 'fullscreen',
@@ -68,14 +68,14 @@
68
68
  }
69
69
 
70
70
  .memori-copy-button--success {
71
- border-color: var(--memori-success-color);
72
- background: color-mix(in oklch, var(--memori-main-background) 82%, var(--memori-success-color) 18%);
71
+ border-color: var(--memori-success);
72
+ background: color-mix(in oklch, var(--memori-main-background) 82%, var(--memori-success) 18%);
73
73
  color: var(--memori-text-color);
74
74
  }
75
75
 
76
76
  .memori-copy-button--error {
77
- border-color: var(--memori-error-color);
78
- background: color-mix(in oklch, var(--memori-main-background) 84%, var(--memori-error-color) 16%);
77
+ border-color: var(--memori-error);
78
+ background: color-mix(in oklch, var(--memori-main-background) 84%, var(--memori-error) 16%);
79
79
  color: var(--memori-text-color);
80
80
  }
81
81
 
@@ -21,7 +21,7 @@
21
21
  * Split-panel width for ArtifactDrawer.
22
22
  * Must stay in sync with HiddenChat's sidebar shift (`right: 55%`).
23
23
  * @memori.ai/ui Drawer uses `--memori-modal-size-*` (not the legacy
24
- * `--memori-drawer--width-*` tokens), and size="md" maps to `--memori-modal-size-md`.
24
+ * size="md" maps to `--memori-modal-size-md`.
25
25
  */
26
26
  .memori-drawer--right.memori-drawer--size-md.memori-artifact-panel-drawer {
27
27
  --memori-modal-size-md: 55%;
@@ -640,8 +640,31 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
640
640
  }
641
641
 
642
642
  .memori-artifact-drawer--close-icon {
643
- width: 18px;
644
- height: 18px;
643
+ width: 16px;
644
+ height: 16px;
645
+ }
646
+
647
+ /* Keep close control the same size as other artifact header icons,
648
+ including Chat stories that do not wrap in .memori-widget. */
649
+ .memori-artifact-drawer--close.memori-icon-button.memori-button {
650
+ display: inline-flex;
651
+ width: 2.5rem;
652
+ min-width: 2.5rem;
653
+ height: 2.5rem;
654
+ min-height: 2.5rem;
655
+ box-sizing: border-box;
656
+ align-items: center;
657
+ justify-content: center;
658
+ padding: 0;
659
+ }
660
+
661
+ .memori-artifact-drawer--close .memori-icon-close,
662
+ .memori-artifact-drawer--close svg {
663
+ width: 16px;
664
+ height: 16px;
665
+ flex-shrink: 0;
666
+ fill: none;
667
+ stroke: currentColor;
645
668
  }
646
669
 
647
670
  /* Content */
@@ -714,8 +737,8 @@ body:has(.memori-artifact-panel-drawer-fullscreen) .memori-drawer__backdrop,
714
737
  }
715
738
 
716
739
  .memori-widget .memori-artifact-drawer--close .memori-icon-close {
717
- width: 1.125rem;
718
- height: 1.125rem;
740
+ width: 16px;
741
+ height: 16px;
719
742
  fill: none;
720
743
  stroke: currentColor;
721
744
  }
@@ -270,9 +270,8 @@ const ArtifactDrawer: React.FC<{
270
270
  aria-label={t('artifact.close') || 'Close'}
271
271
  title={t('artifact.close') || 'Close'}
272
272
  className="memori-artifact-drawer--close"
273
- >
274
- <X className="memori-icon-close" aria-hidden />
275
- </IconButton>
273
+ icon={<X className="memori-icon-close" aria-hidden />}
274
+ />
276
275
  )}
277
276
  </>
278
277
  )}
@@ -400,9 +399,8 @@ const ArtifactDrawer: React.FC<{
400
399
  aria-label={t('artifact.close') || 'Close'}
401
400
  title={t('artifact.close') || 'Close'}
402
401
  className="memori-artifact-drawer--close"
403
- >
404
- <X className="memori-icon-close" aria-hidden />
405
- </IconButton>
402
+ icon={<X className="memori-icon-close" aria-hidden />}
403
+ />
406
404
  </div>
407
405
  </>
408
406
  )}
@@ -562,7 +562,7 @@ const ArtifactHandler: React.FC<ArtifactHandlerProps> = ({
562
562
  className="memori-artifact-handler memori-artifact-handler--failed"
563
563
  style={{
564
564
  opacity: 0.85,
565
- border: '1px dashed var(--memori-danger, #ef4444)',
565
+ border: '1px dashed var(--memori-error, #ef4444)',
566
566
  cursor: 'default',
567
567
  }}
568
568
  role="status"
@@ -275,35 +275,39 @@ describe('ArtifactAPIBridge', () => {
275
275
  expect(window.MemoriArtifactAPI).toBeUndefined();
276
276
  });
277
277
 
278
- it('should handle different mime types with correct titles', async () => {
279
- renderWithProviders(
280
- <MemoriWidget memori={mockMemori} tenantID="test-tenant-id" />
281
- );
282
-
283
- const testCases = [
284
- { mimeType: 'html', expectedTitle: 'HTML Document' },
285
- { mimeType: 'markdown', expectedTitle: 'Markdown Document' },
286
- { mimeType: 'javascript', expectedTitle: 'JavaScript Code' },
287
- { mimeType: 'python', expectedTitle: 'Python Code' },
288
- { mimeType: 'json', expectedTitle: 'JSON Data' },
289
- { mimeType: 'css', expectedTitle: 'CSS Stylesheet' },
290
- { mimeType: 'typescript', expectedTitle: 'TypeScript Code' },
291
- { mimeType: 'xml', expectedTitle: 'XML Document' },
292
- { mimeType: 'svg', expectedTitle: 'SVG Image' },
293
- { mimeType: 'unknown', expectedTitle: 'Document' },
294
- ];
295
-
296
- for (const testCase of testCases) {
297
- window.MemoriArtifactAPI!.createAndOpenArtifact(
298
- 'test content',
299
- testCase.mimeType
278
+ it(
279
+ 'should handle different mime types with correct titles',
280
+ async () => {
281
+ renderWithProviders(
282
+ <MemoriWidget memori={mockMemori} tenantID="test-tenant-id" />
300
283
  );
301
284
 
302
- await waitFor(() => {
303
- const state = window.MemoriArtifactAPI!.getState();
304
- expect(state.currentArtifact?.title).toBe(testCase.expectedTitle);
305
- });
306
- }
307
- });
285
+ const testCases = [
286
+ { mimeType: 'html', expectedTitle: 'HTML Document' },
287
+ { mimeType: 'markdown', expectedTitle: 'Markdown Document' },
288
+ { mimeType: 'javascript', expectedTitle: 'JavaScript Code' },
289
+ { mimeType: 'python', expectedTitle: 'Python Code' },
290
+ { mimeType: 'json', expectedTitle: 'JSON Data' },
291
+ { mimeType: 'css', expectedTitle: 'CSS Stylesheet' },
292
+ { mimeType: 'typescript', expectedTitle: 'TypeScript Code' },
293
+ { mimeType: 'xml', expectedTitle: 'XML Document' },
294
+ { mimeType: 'svg', expectedTitle: 'SVG Image' },
295
+ { mimeType: 'unknown', expectedTitle: 'Document' },
296
+ ];
297
+
298
+ for (const testCase of testCases) {
299
+ window.MemoriArtifactAPI!.createAndOpenArtifact(
300
+ 'test content',
301
+ testCase.mimeType
302
+ );
303
+
304
+ await waitFor(() => {
305
+ const state = window.MemoriArtifactAPI!.getState();
306
+ expect(state.currentArtifact?.title).toBe(testCase.expectedTitle);
307
+ });
308
+ }
309
+ },
310
+ 15000
311
+ );
308
312
  });
309
313
 
@@ -0,0 +1,55 @@
1
+ import React, { useState } from 'react';
2
+ import { render, screen, waitFor } from '../../testUtils';
3
+ import {
4
+ MemoriUIProvider,
5
+ useMemoriTheme,
6
+ usePortalContainer,
7
+ } from '@memori.ai/ui';
8
+
9
+ function Probe() {
10
+ const portal = usePortalContainer();
11
+ const theme = useMemoriTheme();
12
+ return (
13
+ <div
14
+ data-testid="probe"
15
+ data-portal-is-root={
16
+ portal instanceof HTMLElement &&
17
+ portal.getAttribute('data-memori-probe-root') === '1'
18
+ ? 'yes'
19
+ : 'no'
20
+ }
21
+ data-theme-context={theme}
22
+ />
23
+ );
24
+ }
25
+
26
+ function Harness({ theme }: { theme: 'light' | 'dark' }) {
27
+ const [root, setRoot] = useState<HTMLDivElement | null>(null);
28
+ return (
29
+ <div
30
+ ref={setRoot}
31
+ data-theme={theme}
32
+ data-memori-probe-root="1"
33
+ data-testid="widget-root"
34
+ >
35
+ <MemoriUIProvider container={root} theme={theme}>
36
+ <Probe />
37
+ </MemoriUIProvider>
38
+ </div>
39
+ );
40
+ }
41
+
42
+ describe('MemoriUIProvider embed contract', () => {
43
+ it('keeps portal target on the widget root and theme in sync with data-theme', async () => {
44
+ render(<Harness theme="dark" />);
45
+
46
+ const root = screen.getByTestId('widget-root');
47
+ expect(root).toHaveAttribute('data-theme', 'dark');
48
+
49
+ await waitFor(() => {
50
+ const probe = screen.getByTestId('probe');
51
+ expect(probe).toHaveAttribute('data-portal-is-root', 'yes');
52
+ expect(probe).toHaveAttribute('data-theme-context', 'dark');
53
+ });
54
+ });
55
+ });