@memori.ai/memori-react 9.0.0-alpha.21 → 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 (250) hide show
  1. package/CHANGELOG.md +18 -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 +2 -4
  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/Header/Header.css +8 -3
  31. package/dist/components/Header/Header.js +15 -18
  32. package/dist/components/Header/Header.js.map +1 -1
  33. package/dist/components/IconButton/IconButton.d.ts +1 -1
  34. package/dist/components/KnownFacts/KnownFacts.css +1 -1
  35. package/dist/components/KnownFacts/KnownFacts.js +2 -5
  36. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  37. package/dist/components/LoginDrawer/LoginDrawer.css +16 -14
  38. package/dist/components/LoginDrawer/LoginDrawer.js +19 -11
  39. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  40. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +4 -4
  41. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +28 -5
  42. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -2
  43. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  44. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +1 -1
  45. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  46. package/dist/components/MemoriWidget/MemoriWidget.js +35 -31
  47. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  48. package/dist/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  49. package/dist/components/PositionPopover/PositionPopover.css +3 -3
  50. package/dist/components/PositionPopover/PositionPopover.js +38 -25
  51. package/dist/components/PositionPopover/PositionPopover.js.map +1 -1
  52. package/dist/components/Snippet/Snippet.css +1 -1
  53. package/dist/components/StartPanel/StartPanel.css +19 -3
  54. package/dist/components/StartPanel/StartPanel.js +12 -18
  55. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  56. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  57. package/dist/components/layouts/totem.css +43 -9
  58. package/dist/helpers/positionPopover.d.ts +2 -1
  59. package/dist/helpers/positionPopover.js +10 -2
  60. package/dist/helpers/positionPopover.js.map +1 -1
  61. package/dist/icons/MemoriIcon.js +1 -1
  62. package/dist/icons/MemoriIcon.js.map +1 -1
  63. package/dist/locales/de.json +4 -1
  64. package/dist/locales/en.json +3 -1
  65. package/dist/locales/es.json +3 -1
  66. package/dist/locales/fr.json +3 -1
  67. package/dist/locales/it.json +3 -1
  68. package/dist/styles.css +1 -1
  69. package/dist/version.d.ts +1 -1
  70. package/dist/version.js +1 -1
  71. package/esm/components/AgeVerificationModal/AgeVerificationModal.css +1 -7
  72. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +1 -1
  73. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  74. package/esm/components/Auth/Auth.css +12 -5
  75. package/esm/components/Auth/Auth.d.ts +1 -1
  76. package/esm/components/Auth/Auth.js +47 -33
  77. package/esm/components/Auth/Auth.js.map +1 -1
  78. package/esm/components/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  79. package/esm/components/Chat/Chat.css +1 -0
  80. package/esm/components/Chat/Chat.js +1 -1
  81. package/esm/components/Chat/Chat.js.map +1 -1
  82. package/esm/components/ChatBubble/ChatBubble.css +32 -5
  83. package/esm/components/ChatBubble/ChatBubble.js +2 -4
  84. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  85. package/esm/components/ChatHistoryDrawer/ChatHistory.d.ts +3 -1
  86. package/esm/components/ChatHistoryDrawer/ChatHistory.js +2 -2
  87. package/esm/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  88. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  89. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.d.ts +3 -1
  90. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js +9 -59
  91. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  92. package/esm/components/ChatInputs/ChatInputs.js +11 -2
  93. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  94. package/esm/components/ChatTextArea/ChatTextArea.css +1 -1
  95. package/esm/components/ContentPreviewModal/ContentPreviewModal.css +1 -10
  96. package/esm/components/ContentPreviewModal/ContentPreviewModal.js +1 -1
  97. package/esm/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  98. package/esm/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  99. package/esm/components/Header/Header.css +8 -3
  100. package/esm/components/Header/Header.js +15 -18
  101. package/esm/components/Header/Header.js.map +1 -1
  102. package/esm/components/IconButton/IconButton.d.ts +1 -1
  103. package/esm/components/KnownFacts/KnownFacts.css +1 -1
  104. package/esm/components/KnownFacts/KnownFacts.js +2 -5
  105. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  106. package/esm/components/LoginDrawer/LoginDrawer.css +16 -14
  107. package/esm/components/LoginDrawer/LoginDrawer.js +20 -12
  108. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  109. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +4 -4
  110. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +28 -5
  111. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -2
  112. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  113. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +1 -1
  114. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  115. package/esm/components/MemoriWidget/MemoriWidget.js +36 -32
  116. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  117. package/esm/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  118. package/esm/components/PositionPopover/PositionPopover.css +3 -3
  119. package/esm/components/PositionPopover/PositionPopover.js +39 -26
  120. package/esm/components/PositionPopover/PositionPopover.js.map +1 -1
  121. package/esm/components/Snippet/Snippet.css +1 -1
  122. package/esm/components/StartPanel/StartPanel.css +19 -3
  123. package/esm/components/StartPanel/StartPanel.js +12 -18
  124. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  125. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  126. package/esm/components/layouts/totem.css +43 -9
  127. package/esm/helpers/positionPopover.d.ts +2 -1
  128. package/esm/helpers/positionPopover.js +9 -2
  129. package/esm/helpers/positionPopover.js.map +1 -1
  130. package/esm/icons/MemoriIcon.js +1 -1
  131. package/esm/icons/MemoriIcon.js.map +1 -1
  132. package/esm/locales/de.json +4 -1
  133. package/esm/locales/en.json +3 -1
  134. package/esm/locales/es.json +3 -1
  135. package/esm/locales/fr.json +3 -1
  136. package/esm/locales/it.json +3 -1
  137. package/esm/styles.css +1 -1
  138. package/esm/version.d.ts +1 -1
  139. package/esm/version.js +1 -1
  140. package/package.json +5 -3
  141. package/src/Live/Agents.stories.tsx +49 -0
  142. package/src/Live/KnownFacts.stories.tsx +50 -0
  143. package/src/Showcase.stories.tsx +3 -14
  144. package/src/components/AgeVerificationModal/AgeVerificationModal.css +1 -7
  145. package/src/components/AgeVerificationModal/AgeVerificationModal.stories.tsx +1 -1
  146. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +1 -0
  147. package/src/components/Auth/Auth.css +12 -5
  148. package/src/components/Auth/Auth.stories.tsx +1 -1
  149. package/src/components/Auth/Auth.test.tsx +68 -1
  150. package/src/components/Auth/Auth.tsx +69 -54
  151. package/src/components/Auth/__snapshots__/Auth.test.tsx.snap +5 -6
  152. package/src/components/Avatar/Avatar.stories.tsx +1 -18
  153. package/src/components/Avatar/AvatarView/AvatarView.stories.tsx +1 -103
  154. package/src/components/Blob/Blob.stories.tsx +1 -1
  155. package/src/components/BlockedMemoriBadge/BlockedMemoriBadge.css +7 -6
  156. package/src/components/BlockedMemoriBadge/BlockedMemoriBadge.stories.tsx +1 -1
  157. package/src/components/ChangeMode/ChangeMode.stories.tsx +1 -1
  158. package/src/components/Chat/Chat.css +1 -0
  159. package/src/components/Chat/Chat.stories.tsx +61 -7
  160. package/src/components/Chat/Chat.tsx +1 -0
  161. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +80 -80
  162. package/src/components/ChatBubble/ChatBubble.css +32 -5
  163. package/src/components/ChatBubble/ChatBubble.stories.tsx +13 -2
  164. package/src/components/ChatBubble/ChatBubble.test.tsx +21 -1
  165. package/src/components/ChatBubble/ChatBubble.tsx +7 -13
  166. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +158 -185
  167. package/src/components/ChatHistoryDrawer/ChatHistory.stories.tsx +1 -1
  168. package/src/components/ChatHistoryDrawer/ChatHistory.tsx +6 -0
  169. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.css +1 -1
  170. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.tsx +24 -81
  171. package/src/components/ChatInputs/ChatInputs.stories.tsx +1 -39
  172. package/src/components/ChatInputs/ChatInputs.test.tsx +47 -0
  173. package/src/components/ChatInputs/ChatInputs.tsx +12 -2
  174. package/src/components/ChatTextArea/ChatTextArea.css +1 -1
  175. package/src/components/CompletionProviderStatus/CompletionProviderStatus.stories.tsx +1 -1
  176. package/src/components/ContentPreviewModal/ContentPreviewModal.css +1 -10
  177. package/src/components/ContentPreviewModal/ContentPreviewModal.tsx +1 -1
  178. package/src/components/ExpertsDrawer/ExpertsDrawer.css +0 -6
  179. package/src/components/ExpertsDrawer/ExpertsDrawer.stories.tsx +1 -1
  180. package/src/components/FeedbackButtons/FeedbackButtons.stories.tsx +29 -10
  181. package/src/components/Header/Header.css +8 -3
  182. package/src/components/Header/Header.stories.tsx +1 -1
  183. package/src/components/Header/Header.tsx +146 -117
  184. package/src/components/KnownFacts/KnownFacts.css +1 -1
  185. package/src/components/KnownFacts/KnownFacts.stories.tsx +1 -23
  186. package/src/components/KnownFacts/KnownFacts.tsx +4 -9
  187. package/src/components/LoginDrawer/LoginDrawer.css +16 -14
  188. package/src/components/LoginDrawer/LoginDrawer.stories.tsx +2 -52
  189. package/src/components/LoginDrawer/LoginDrawer.tsx +51 -39
  190. package/src/components/MediaWidget/MediaItemWidget.stories.tsx +1 -15
  191. package/src/components/MediaWidget/MediaWidget.stories.tsx +1 -45
  192. package/src/components/MemoriArtifactSystem/components/ArtifactActions/CopyButton.stories.tsx +1 -1
  193. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +4 -4
  194. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +28 -5
  195. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +4 -6
  196. package/src/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.tsx +1 -1
  197. package/src/components/MemoriArtifactSystem/utils/ArtifactAPI.test.tsx +32 -28
  198. package/src/components/MemoriWidget/MemoriUIProvider.contract.test.tsx +55 -0
  199. package/src/components/MemoriWidget/MemoriWidget.stories.tsx +55 -77
  200. package/src/components/MemoriWidget/MemoriWidget.tsx +49 -44
  201. package/src/components/MemoriWidget/getChatStyles.test.ts +24 -0
  202. package/src/components/MicrophoneButton/MicrophoneButton.stories.tsx +1 -1
  203. package/src/components/MobileSessionPanel/MobileSessionPanel.css +2 -2
  204. package/src/components/PositionPopover/PositionPopover.css +3 -3
  205. package/src/components/PositionPopover/PositionPopover.stories.tsx +1 -1
  206. package/src/components/PositionPopover/PositionPopover.tsx +50 -28
  207. package/src/components/PoweredBy/PoweredBy.stories.tsx +1 -54
  208. package/src/components/PoweredBy/__snapshots__/PoweredBy.test.tsx.snap +2 -2
  209. package/src/components/SendOnEnterMenu/SendOnEnterMenu.stories.tsx +1 -1
  210. package/src/components/SettingsDrawer/SettingsDrawer.stories.tsx +1 -1
  211. package/src/components/ShareButton/ShareButton.stories.tsx +1 -1
  212. package/src/components/Snippet/Snippet.css +1 -1
  213. package/src/components/Snippet/Snippet.stories.tsx +1 -1
  214. package/src/components/StartPanel/StartPanel.css +19 -3
  215. package/src/components/StartPanel/StartPanel.stories.tsx +2 -2
  216. package/src/components/StartPanel/StartPanel.tsx +22 -35
  217. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +177 -121
  218. package/src/components/Typing/Typing.stories.tsx +1 -1
  219. package/src/components/WhyThisAnswer/WhyThisAnswer.stories.tsx +22 -44
  220. package/src/components/layouts/FullBody/FullBody.stories.tsx +55 -68
  221. package/src/components/layouts/Totem/Totem.stories.tsx +69 -87
  222. package/src/components/layouts/WebsiteAssistant/website-assistant.css +3 -3
  223. package/src/components/layouts/ZoomedFullBody/ZoomedFullBody.stories.tsx +69 -87
  224. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +19 -41
  225. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +39 -83
  226. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +15 -11
  227. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +116 -42
  228. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +18 -40
  229. package/src/components/layouts/layouts.stories.tsx +96 -179
  230. package/src/components/layouts/totem.css +43 -9
  231. package/src/helpers/positionPopover.test.ts +36 -1
  232. package/src/helpers/positionPopover.ts +21 -4
  233. package/src/i18n.knownFacts.test.ts +40 -0
  234. package/src/icons/MemoriIcon.tsx +1 -1
  235. package/src/index.stories.tsx +1 -47
  236. package/src/locales/de.json +4 -1
  237. package/src/locales/en.json +3 -1
  238. package/src/locales/es.json +3 -1
  239. package/src/locales/fr.json +3 -1
  240. package/src/locales/it.json +3 -1
  241. package/src/styles.css +13 -27
  242. package/src/version.ts +1 -1
  243. package/src/components/ChatTextArea/ChatTextArea.stories.tsx +0 -55
  244. package/src/components/CustomGLBModelViewer/ModelViewer.stories.tsx +0 -58
  245. package/src/components/DateSelector/DateSelector.stories.tsx +0 -47
  246. package/src/components/FilePreview/FilePreview.stories.tsx +0 -63
  247. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +0 -265
  248. package/src/components/UploadButton/UploadButton.stories.tsx +0 -510
  249. package/src/components/VenueWidget/VenueWidget.stories.tsx +0 -69
  250. 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">
@@ -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
+ });