@memori.ai/memori-react 9.0.0-alpha.24 → 9.0.0-alpha.25

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 (265) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +1 -3
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  4. package/dist/components/Auth/Auth.js +1 -3
  5. package/dist/components/Auth/Auth.js.map +1 -1
  6. package/dist/components/Chat/Chat.css +10 -1
  7. package/dist/components/Chat/Chat.js +1 -3
  8. package/dist/components/Chat/Chat.js.map +1 -1
  9. package/dist/components/ChatBubble/ChatBubble.css +103 -5
  10. package/dist/components/ChatBubble/ChatBubble.js +48 -8
  11. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  12. package/dist/components/ChatHistoryDrawer/ChatHistory.js +1 -3
  13. package/dist/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  14. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.css +33 -10
  15. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.js +2 -4
  16. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  17. package/dist/components/ChatInputs/ChatInputs.css +17 -52
  18. package/dist/components/ChatInputs/ChatInputs.js +1 -3
  19. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  20. package/dist/components/ContentPreviewModal/ContentPreviewModal.css +3 -3
  21. package/dist/components/ContentPreviewModal/ContentPreviewModal.js +1 -3
  22. package/dist/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  23. package/dist/components/DateSelector/DateSelector.css +66 -3
  24. package/dist/components/DateSelector/DateSelector.js +5 -1
  25. package/dist/components/DateSelector/DateSelector.js.map +1 -1
  26. package/dist/components/ExpertsDrawer/ExpertsDrawer.js +1 -3
  27. package/dist/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
  28. package/dist/components/FilePreview/FilePreview.css +94 -220
  29. package/dist/components/FilePreview/FilePreview.js +25 -71
  30. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  31. package/dist/components/IconButton/IconButton.css +2 -11
  32. package/dist/components/KnownFacts/KnownFacts.css +3 -4
  33. package/dist/components/KnownFacts/KnownFacts.js +3 -5
  34. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  35. package/dist/components/LoginDrawer/LoginDrawer.css +3 -7
  36. package/dist/components/LoginDrawer/LoginDrawer.js +51 -9
  37. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  38. package/dist/components/MediaWidget/MediaItemWidget.css +77 -57
  39. package/dist/components/MediaWidget/MediaItemWidget.js +4 -4
  40. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  41. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +1 -1
  42. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -5
  43. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  44. package/dist/components/MemoriWidget/MemoriWidget.css +0 -55
  45. package/dist/components/MemoriWidget/MemoriWidget.js +115 -117
  46. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  47. package/dist/components/MobileSessionPanel/MobileSessionPanel.css +20 -0
  48. package/dist/components/MobileSessionPanel/MobileSessionPanel.js +77 -117
  49. package/dist/components/MobileSessionPanel/MobileSessionPanel.js.map +1 -1
  50. package/dist/components/PositionPopover/PositionPopover.css +1 -1
  51. package/dist/components/SettingsDrawer/SettingsDrawer.js +1 -3
  52. package/dist/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  53. package/dist/components/StartPanel/StartPanel.css +12 -1
  54. package/dist/components/StartPanel/StartPanel.js +30 -7
  55. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  56. package/dist/components/UploadButton/UploadButton.css +7 -7
  57. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +1 -3
  58. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  59. package/dist/components/UploadButton/UploadImages/UploadImages.js +1 -3
  60. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  61. package/dist/components/WhyThisAnswer/WhyThisAnswer.js +1 -3
  62. package/dist/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  63. package/dist/components/layouts/HiddenChat.js +9 -1
  64. package/dist/components/layouts/HiddenChat.js.map +1 -1
  65. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js +84 -5
  66. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  67. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +36 -12
  68. package/dist/components/layouts/fullpage.css +1 -0
  69. package/dist/components/layouts/hidden-chat.css +29 -5
  70. package/dist/helpers/error.js +2 -1
  71. package/dist/helpers/error.js.map +1 -1
  72. package/dist/helpers/positionPopover.d.ts +1 -0
  73. package/dist/helpers/positionPopover.js +7 -0
  74. package/dist/helpers/positionPopover.js.map +1 -1
  75. package/dist/helpers/usePressTooltip.d.ts +6 -1
  76. package/dist/helpers/usePressTooltip.js +16 -1
  77. package/dist/helpers/usePressTooltip.js.map +1 -1
  78. package/dist/locales/de.json +8 -2
  79. package/dist/locales/en.json +6 -3
  80. package/dist/locales/es.json +6 -3
  81. package/dist/locales/fr.json +6 -3
  82. package/dist/locales/it.json +6 -3
  83. package/dist/styles.css +1 -1
  84. package/dist/version.d.ts +1 -1
  85. package/dist/version.js +1 -1
  86. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +1 -3
  87. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  88. package/esm/components/Auth/Auth.js +1 -3
  89. package/esm/components/Auth/Auth.js.map +1 -1
  90. package/esm/components/Chat/Chat.css +10 -1
  91. package/esm/components/Chat/Chat.js +1 -3
  92. package/esm/components/Chat/Chat.js.map +1 -1
  93. package/esm/components/ChatBubble/ChatBubble.css +103 -5
  94. package/esm/components/ChatBubble/ChatBubble.js +48 -8
  95. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  96. package/esm/components/ChatHistoryDrawer/ChatHistory.js +1 -3
  97. package/esm/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  98. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.css +33 -10
  99. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js +2 -4
  100. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.js.map +1 -1
  101. package/esm/components/ChatInputs/ChatInputs.css +17 -52
  102. package/esm/components/ChatInputs/ChatInputs.js +1 -3
  103. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  104. package/esm/components/ContentPreviewModal/ContentPreviewModal.css +3 -3
  105. package/esm/components/ContentPreviewModal/ContentPreviewModal.js +1 -3
  106. package/esm/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  107. package/esm/components/DateSelector/DateSelector.css +66 -3
  108. package/esm/components/DateSelector/DateSelector.js +5 -1
  109. package/esm/components/DateSelector/DateSelector.js.map +1 -1
  110. package/esm/components/ExpertsDrawer/ExpertsDrawer.js +1 -3
  111. package/esm/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
  112. package/esm/components/FilePreview/FilePreview.css +94 -220
  113. package/esm/components/FilePreview/FilePreview.js +25 -71
  114. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  115. package/esm/components/IconButton/IconButton.css +2 -11
  116. package/esm/components/KnownFacts/KnownFacts.css +3 -4
  117. package/esm/components/KnownFacts/KnownFacts.js +3 -5
  118. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  119. package/esm/components/LoginDrawer/LoginDrawer.css +3 -7
  120. package/esm/components/LoginDrawer/LoginDrawer.js +51 -9
  121. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  122. package/esm/components/MediaWidget/MediaItemWidget.css +77 -57
  123. package/esm/components/MediaWidget/MediaItemWidget.js +5 -5
  124. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  125. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +1 -1
  126. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +2 -5
  127. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  128. package/esm/components/MemoriWidget/MemoriWidget.css +0 -55
  129. package/esm/components/MemoriWidget/MemoriWidget.js +115 -117
  130. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  131. package/esm/components/MobileSessionPanel/MobileSessionPanel.css +20 -0
  132. package/esm/components/MobileSessionPanel/MobileSessionPanel.js +78 -118
  133. package/esm/components/MobileSessionPanel/MobileSessionPanel.js.map +1 -1
  134. package/esm/components/PositionPopover/PositionPopover.css +1 -1
  135. package/esm/components/SettingsDrawer/SettingsDrawer.js +1 -3
  136. package/esm/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  137. package/esm/components/StartPanel/StartPanel.css +12 -1
  138. package/esm/components/StartPanel/StartPanel.js +30 -7
  139. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  140. package/esm/components/UploadButton/UploadButton.css +7 -7
  141. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +1 -3
  142. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  143. package/esm/components/UploadButton/UploadImages/UploadImages.js +1 -3
  144. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  145. package/esm/components/WhyThisAnswer/WhyThisAnswer.js +1 -3
  146. package/esm/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  147. package/esm/components/layouts/HiddenChat.js +9 -1
  148. package/esm/components/layouts/HiddenChat.js.map +1 -1
  149. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js +85 -6
  150. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  151. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +36 -12
  152. package/esm/components/layouts/fullpage.css +1 -0
  153. package/esm/components/layouts/hidden-chat.css +29 -5
  154. package/esm/helpers/error.js +2 -1
  155. package/esm/helpers/error.js.map +1 -1
  156. package/esm/helpers/positionPopover.d.ts +1 -0
  157. package/esm/helpers/positionPopover.js +6 -0
  158. package/esm/helpers/positionPopover.js.map +1 -1
  159. package/esm/helpers/usePressTooltip.d.ts +6 -1
  160. package/esm/helpers/usePressTooltip.js +17 -2
  161. package/esm/helpers/usePressTooltip.js.map +1 -1
  162. package/esm/locales/de.json +8 -2
  163. package/esm/locales/en.json +6 -3
  164. package/esm/locales/es.json +6 -3
  165. package/esm/locales/fr.json +6 -3
  166. package/esm/locales/it.json +6 -3
  167. package/esm/styles.css +1 -1
  168. package/esm/version.d.ts +1 -1
  169. package/esm/version.js +1 -1
  170. package/package.json +4 -3
  171. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +0 -3
  172. package/src/components/Auth/Auth.tsx +0 -3
  173. package/src/components/Auth/__snapshots__/Auth.test.tsx.snap +1 -0
  174. package/src/components/BlockedMemoriBadge/__snapshots__/BlockedMemoriBadge.test.tsx.snap +5 -0
  175. package/src/components/Chat/Chat.css +10 -1
  176. package/src/components/Chat/Chat.tsx +0 -3
  177. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +1735 -1765
  178. package/src/components/ChatBubble/ChatBubble.css +103 -5
  179. package/src/components/ChatBubble/ChatBubble.test.tsx +33 -0
  180. package/src/components/ChatBubble/ChatBubble.tsx +524 -273
  181. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +655 -684
  182. package/src/components/ChatHistoryDrawer/ChatHistory.tsx +0 -3
  183. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.css +33 -10
  184. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.tsx +3 -6
  185. package/src/components/ChatInputs/ChatInputs.css +17 -52
  186. package/src/components/ChatInputs/ChatInputs.tsx +2 -4
  187. package/src/components/CompletionProviderStatus/__snapshots__/CompletionProviderStatus.test.tsx.snap +3 -0
  188. package/src/components/ContentPreviewModal/ContentPreviewModal.css +3 -3
  189. package/src/components/ContentPreviewModal/ContentPreviewModal.tsx +0 -3
  190. package/src/components/DateSelector/DateSelector.css +66 -3
  191. package/src/components/DateSelector/DateSelector.test.tsx +33 -4
  192. package/src/components/DateSelector/DateSelector.tsx +37 -11
  193. package/src/components/ExpertsDrawer/ExpertsDrawer.tsx +0 -3
  194. package/src/components/FeedbackButtons/__snapshots__/FeedbackButtons.test.tsx.snap +2 -1
  195. package/src/components/FilePreview/FilePreview.css +94 -220
  196. package/src/components/FilePreview/FilePreview.tsx +77 -124
  197. package/src/components/FilePreview/__snapshots__/FilePreview.test.tsx.snap +33 -81
  198. package/src/components/Header/ChatConsumptionDropdown.test.tsx +53 -86
  199. package/src/components/Header/__snapshots__/Header.test.tsx.snap +60 -44
  200. package/src/components/IconButton/IconButton.css +2 -11
  201. package/src/components/KnownFacts/KnownFacts.css +3 -4
  202. package/src/components/KnownFacts/KnownFacts.tsx +0 -5
  203. package/src/components/KnownFacts/__snapshots__/KnownFacts.test.tsx.snap +2 -6
  204. package/src/components/LoginDrawer/LoginDrawer.css +3 -7
  205. package/src/components/LoginDrawer/LoginDrawer.tsx +101 -54
  206. package/src/components/LoginDrawer/__snapshots__/LoginDrawer.test.tsx.snap +11 -33
  207. package/src/components/MediaWidget/MediaItemWidget.css +77 -57
  208. package/src/components/MediaWidget/MediaItemWidget.test.tsx +33 -0
  209. package/src/components/MediaWidget/MediaItemWidget.tsx +6 -12
  210. package/src/components/MediaWidget/__snapshots__/MediaItemWidget.test.tsx.snap +2 -0
  211. package/src/components/MediaWidget/__snapshots__/MediaWidget.test.tsx.snap +1 -1
  212. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +1 -1
  213. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +0 -5
  214. package/src/components/MemoriWidget/MemoriUIProvider.contract.test.tsx +25 -7
  215. package/src/components/MemoriWidget/MemoriWidget.css +0 -55
  216. package/src/components/MemoriWidget/MemoriWidget.tsx +18 -12
  217. package/src/components/MobileSessionPanel/MobileSessionPanel.css +20 -0
  218. package/src/components/MobileSessionPanel/MobileSessionPanel.tsx +29 -68
  219. package/src/components/PositionPopover/PositionPopover.css +1 -1
  220. package/src/components/SettingsDrawer/SettingsDrawer.tsx +0 -3
  221. package/src/components/ShareButton/__snapshots__/ShareButton.test.tsx.snap +9 -9
  222. package/src/components/Snippet/__snapshots__/Snippet.test.tsx.snap +8 -0
  223. package/src/components/StartPanel/StartPanel.css +12 -1
  224. package/src/components/StartPanel/StartPanel.test.tsx +57 -0
  225. package/src/components/StartPanel/StartPanel.tsx +41 -4
  226. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +41 -6
  227. package/src/components/UploadButton/UploadButton.css +7 -7
  228. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +0 -3
  229. package/src/components/UploadButton/UploadImages/UploadImages.tsx +0 -3
  230. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +8 -10
  231. package/src/components/WhyThisAnswer/WhyThisAnswer.tsx +0 -3
  232. package/src/components/WhyThisAnswer/__snapshots__/WhyThisAnswer.test.tsx.snap +3 -9
  233. package/src/components/layouts/HiddenChat.tsx +9 -1
  234. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.tsx +103 -6
  235. package/src/components/layouts/WebsiteAssistant/__snapshots__/WebsiteAssistant.test.tsx.snap +63 -57
  236. package/src/components/layouts/WebsiteAssistant/website-assistant.css +36 -12
  237. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +7 -4
  238. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +12 -8
  239. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +7 -4
  240. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +10 -5
  241. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +6 -4
  242. package/src/components/layouts/fullpage.css +1 -0
  243. package/src/components/layouts/hidden-chat.css +29 -5
  244. package/src/components/layouts/layouts.stories.tsx +2 -2
  245. package/src/helpers/error.ts +2 -1
  246. package/src/helpers/positionPopover.test.ts +15 -0
  247. package/src/helpers/positionPopover.ts +16 -0
  248. package/src/helpers/usePressTooltip.test.ts +30 -0
  249. package/src/helpers/usePressTooltip.ts +31 -1
  250. package/src/index.tsx +1 -1
  251. package/src/locales/de.json +8 -2
  252. package/src/locales/en.json +6 -3
  253. package/src/locales/es.json +6 -3
  254. package/src/locales/fr.json +6 -3
  255. package/src/locales/it.json +6 -3
  256. package/src/styles.brandTokens.test.js +52 -0
  257. package/src/styles.css +27 -2
  258. package/src/version.ts +1 -1
  259. package/dist/context/widgetSurfaceContext.d.ts +0 -3
  260. package/dist/context/widgetSurfaceContext.js +0 -11
  261. package/dist/context/widgetSurfaceContext.js.map +0 -1
  262. package/esm/context/widgetSurfaceContext.d.ts +0 -3
  263. package/esm/context/widgetSurfaceContext.js +0 -7
  264. package/esm/context/widgetSurfaceContext.js.map +0 -1
  265. package/src/context/widgetSurfaceContext.tsx +0 -14
@@ -10,7 +10,7 @@ exports[`renders Totem layout unchanged 1`] = `
10
10
  data-memori-name="Memori"
11
11
  data-memori-secondary-id="25ced51c-3520-41af-8bbe-222d861b8e32"
12
12
  data-theme="light"
13
- style="height: 100vh;"
13
+ style="height: 100vh; --memori-z-index-base: 0;"
14
14
  >
15
15
  <div
16
16
  aria-atomic="false"
@@ -20,11 +20,11 @@ exports[`renders Totem layout unchanged 1`] = `
20
20
  class="memori-alert-viewport memori-alert-viewport--top-end"
21
21
  data-theme="light"
22
22
  role="region"
23
- style="z-index: 10002;"
24
23
  tabindex="-1"
25
24
  />
26
25
  <div
27
26
  class="memori-widget__surface"
27
+ style="--memori-z-index-base: 0;"
28
28
  >
29
29
  <style>
30
30
  @layer memori.overrides {
@@ -225,7 +225,7 @@ exports[`renders Totem layout unchanged 1`] = `
225
225
  >
226
226
  <svg
227
227
  aria-hidden="true"
228
- class="lucide lucide-volume2"
228
+ class="lucide lucide-volume2 lucide-volume-2"
229
229
  fill="none"
230
230
  height="20"
231
231
  stroke="currentColor"
@@ -276,7 +276,7 @@ exports[`renders Totem layout unchanged 1`] = `
276
276
  >
277
277
  <svg
278
278
  aria-hidden="true"
279
- class="lucide lucide-share2"
279
+ class="lucide lucide-share2 lucide-share-2"
280
280
  fill="none"
281
281
  height="24"
282
282
  stroke="currentColor"
@@ -341,6 +341,7 @@ exports[`renders Totem layout unchanged 1`] = `
341
341
  class="memori-button__icon"
342
342
  >
343
343
  <svg
344
+ aria-hidden="true"
344
345
  class="lucide lucide-refresh-cw"
345
346
  fill="none"
346
347
  height="24"
@@ -391,6 +392,7 @@ exports[`renders Totem layout unchanged 1`] = `
391
392
  class="memori-button__icon"
392
393
  >
393
394
  <svg
395
+ aria-hidden="true"
394
396
  class="lucide lucide-settings"
395
397
  fill="none"
396
398
  height="24"
@@ -403,7 +405,7 @@ exports[`renders Totem layout unchanged 1`] = `
403
405
  xmlns="http://www.w3.org/2000/svg"
404
406
  >
405
407
  <path
406
- d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"
408
+ d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"
407
409
  />
408
410
  <circle
409
411
  cx="12"
@@ -452,6 +454,7 @@ exports[`renders Totem layout unchanged 1`] = `
452
454
  class="memori-button__icon"
453
455
  >
454
456
  <svg
457
+ aria-hidden="true"
455
458
  class="lucide lucide-user"
456
459
  fill="none"
457
460
  height="24"
@@ -732,6 +735,7 @@ exports[`renders Totem layout unchanged 1`] = `
732
735
  class="memori--settings-section__icon-box memori--settings-section__icon-box--neutral"
733
736
  >
734
737
  <svg
738
+ aria-hidden="true"
735
739
  class="lucide lucide-eye memori--settings-section__icon"
736
740
  fill="none"
737
741
  height="24"
@@ -788,6 +792,7 @@ exports[`renders Totem layout unchanged 1`] = `
788
792
  class="memori-button__content"
789
793
  >
790
794
  <svg
795
+ aria-hidden="true"
791
796
  class="lucide lucide-info memori--settings-section__inline-info-icon"
792
797
  fill="none"
793
798
  height="24"
@@ -10,7 +10,7 @@ exports[`renders ZOOMED_FULL_BODY layout unchanged 1`] = `
10
10
  data-memori-name="Memori"
11
11
  data-memori-secondary-id="25ced51c-3520-41af-8bbe-222d861b8e32"
12
12
  data-theme="light"
13
- style="height: 100vh;"
13
+ style="height: 100vh; --memori-z-index-base: 0;"
14
14
  >
15
15
  <div
16
16
  aria-atomic="false"
@@ -20,11 +20,11 @@ exports[`renders ZOOMED_FULL_BODY layout unchanged 1`] = `
20
20
  class="memori-alert-viewport memori-alert-viewport--top-end"
21
21
  data-theme="light"
22
22
  role="region"
23
- style="z-index: 10002;"
24
23
  tabindex="-1"
25
24
  />
26
25
  <div
27
26
  class="memori-widget__surface"
27
+ style="--memori-z-index-base: 0;"
28
28
  >
29
29
  <style>
30
30
  @layer memori.overrides {
@@ -92,7 +92,7 @@ exports[`renders ZOOMED_FULL_BODY layout unchanged 1`] = `
92
92
  >
93
93
  <svg
94
94
  aria-hidden="true"
95
- class="lucide lucide-volume2"
95
+ class="lucide lucide-volume2 lucide-volume-2"
96
96
  fill="none"
97
97
  height="20"
98
98
  stroke="currentColor"
@@ -143,7 +143,7 @@ exports[`renders ZOOMED_FULL_BODY layout unchanged 1`] = `
143
143
  >
144
144
  <svg
145
145
  aria-hidden="true"
146
- class="lucide lucide-share2"
146
+ class="lucide lucide-share2 lucide-share-2"
147
147
  fill="none"
148
148
  height="24"
149
149
  stroke="currentColor"
@@ -456,6 +456,7 @@ exports[`renders ZOOMED_FULL_BODY layout unchanged 1`] = `
456
456
  class="memori--settings-section__icon-box memori--settings-section__icon-box--neutral"
457
457
  >
458
458
  <svg
459
+ aria-hidden="true"
459
460
  class="lucide lucide-eye memori--settings-section__icon"
460
461
  fill="none"
461
462
  height="24"
@@ -512,6 +513,7 @@ exports[`renders ZOOMED_FULL_BODY layout unchanged 1`] = `
512
513
  class="memori-button__content"
513
514
  >
514
515
  <svg
516
+ aria-hidden="true"
515
517
  class="lucide lucide-info memori--settings-section__inline-info-icon"
516
518
  fill="none"
517
519
  height="24"
@@ -423,6 +423,7 @@
423
423
  .memori-widget.memori-layout-fullpage .memori-chat-layout--controls .memori-chat-inputs-wrapper {
424
424
  width: 100%;
425
425
  flex-shrink: 0;
426
+ padding: 16px 4px;
426
427
  border: none;
427
428
  border-radius: 0;
428
429
  background: var(--memori-secondary-background);
@@ -190,12 +190,17 @@
190
190
  flex-shrink: 0;
191
191
  }
192
192
 
193
- /* Fullscreen styles */
194
- .memori-sidebar-fullscreen {
193
+ /* Fullscreen styles — cover the full window width (browser FS or class toggle) */
194
+ .memori-sidebar-fullscreen,
195
+ .memori-sidebar:fullscreen,
196
+ .memori-sidebar:-webkit-full-screen {
197
+ top: 0 !important;
195
198
  right: 0 !important;
199
+ left: 0 !important;
196
200
  width: 100% !important;
197
- max-width: 100% !important;
201
+ max-width: none !important;
198
202
  height: 100% !important;
203
+ border-radius: 0;
199
204
  box-shadow: none;
200
205
  }
201
206
 
@@ -287,6 +292,19 @@
287
292
  right: 55%;
288
293
  }
289
294
 
295
+ /* Fullscreen must win over the artifact split offset */
296
+ .memori-sidebar-toggle-artifact:checked
297
+ ~ .memori-sidebar-container
298
+ .memori-sidebar.memori-sidebar-fullscreen,
299
+ .memori-sidebar-toggle-artifact:checked
300
+ ~ .memori-sidebar-container
301
+ .memori-sidebar:fullscreen,
302
+ .memori-sidebar-toggle-artifact:checked
303
+ ~ .memori-sidebar-container
304
+ .memori-sidebar:-webkit-full-screen {
305
+ right: 0 !important;
306
+ }
307
+
290
308
  .memori-sidebar-toggle:checked ~ .memori-sidebar-container .memori-open-label {
291
309
  opacity: 0;
292
310
  pointer-events: none;
@@ -554,16 +572,22 @@
554
572
  }
555
573
 
556
574
  /* Mobile fullscreen styles */
557
- .memori-sidebar-fullscreen {
575
+ .memori-sidebar-fullscreen,
576
+ .memori-sidebar:fullscreen,
577
+ .memori-sidebar:-webkit-full-screen {
558
578
  display: block;
559
579
  }
560
580
 
561
- .memori-sidebar-container .memori-sidebar-fullscreen {
581
+ .memori-sidebar-container .memori-sidebar-fullscreen,
582
+ .memori-sidebar-container .memori-sidebar:fullscreen,
583
+ .memori-sidebar-container .memori-sidebar:-webkit-full-screen {
562
584
  position: fixed;
563
585
  top: 0;
586
+ right: 0 !important;
564
587
  left: 0;
565
588
  display: block;
566
589
  width: 100% !important;
590
+ max-width: none !important;
567
591
  height: 100% !important;
568
592
  }
569
593
  }
@@ -94,10 +94,10 @@ export const WebsiteAssistant: Story = {
94
94
  },
95
95
  };
96
96
 
97
- export const WebsiteAssistantWithout3DAvatar: Story = {
97
+ export const WebsiteAssistantWith3DAvatar: Story = {
98
98
  args: {
99
99
  ...WebsiteAssistant.args,
100
- avatar3dHidden: true,
100
+ avatar3dHidden: false,
101
101
  },
102
102
  };
103
103
 
@@ -52,7 +52,8 @@ const errors = {
52
52
  SESSION_EXPIRED: -103,
53
53
  SESSION_OTP_NOT_FOUND: -107,
54
54
  SESSION_OTP_EXPIRED: -108,
55
- SESSION_MISSING_TEMPORARY_TOKEN: -109,
55
+ SESSION_OTP_INVALID: -109,
56
+ SESSION_OTP_ATTEMPTS_EXCEEDED: -110,
56
57
 
57
58
  MEMORI_MISSING_CONFIGURATION: -201,
58
59
  MEMORI_CONFIGURATION_NOT_FOUND: -202,
@@ -1,8 +1,23 @@
1
1
  import {
2
+ isHeaderPositionPopoverAvailable,
2
3
  shouldHoldAutoStartForPosition,
3
4
  shouldRestartSessionOnPositionPopoverClose,
4
5
  } from './positionPopover';
5
6
 
7
+ describe('isHeaderPositionPopoverAvailable', () => {
8
+ it('is unavailable on mobile when the layout strips needsPosition', () => {
9
+ expect(isHeaderPositionPopoverAvailable(true, true)).toBe(false);
10
+ });
11
+
12
+ it('is available on desktop even when the layout strips on mobile', () => {
13
+ expect(isHeaderPositionPopoverAvailable(false, true)).toBe(true);
14
+ });
15
+
16
+ it('is available on mobile when the layout keeps needsPosition', () => {
17
+ expect(isHeaderPositionPopoverAvailable(true, false)).toBe(true);
18
+ });
19
+ });
20
+
6
21
  describe('shouldHoldAutoStartForPosition', () => {
7
22
  it('holds auto-start when position is required and none is stored', () => {
8
23
  expect(shouldHoldAutoStartForPosition(true, false)).toBe(true);
@@ -10,6 +10,22 @@ export function shouldHoldAutoStartForPosition(
10
10
  return !!needsPosition && !hasPosition;
11
11
  }
12
12
 
13
+ /**
14
+ * Whether Header exposes the position popover for the current layout.
15
+ * Mobile FullPage/Chat/ZoomedFullBody strip `needsPosition` from Header, so
16
+ * PositionPopover is not mounted and StartPanel must not rely on
17
+ * openPositionPopover + autoStartGeolocation alone.
18
+ */
19
+ export function isHeaderPositionPopoverAvailable(
20
+ isMobile: boolean,
21
+ layoutStripsNeedsPositionOnMobile: boolean
22
+ ): boolean {
23
+ if (isMobile && layoutStripsNeedsPositionOnMobile) {
24
+ return false;
25
+ }
26
+ return true;
27
+ }
28
+
13
29
  /**
14
30
  * Whether closing the position popover should re-run autoStart (`onClickStart`).
15
31
  * Only true on a real open → closed transition when a session has not started yet
@@ -0,0 +1,30 @@
1
+ import { renderHook, act } from '@testing-library/react';
2
+ import type { MouseEvent } from 'react';
3
+ import { usePressTooltip } from './usePressTooltip';
4
+
5
+ describe('usePressTooltip', () => {
6
+ it('toggles open on press trigger click and exposes a fixed anchor positioner', () => {
7
+ const { result } = renderHook(() => usePressTooltip());
8
+
9
+ expect(result.current.open).toBe(false);
10
+ expect(result.current.positionerProps.positionMethod).toBe('fixed');
11
+
12
+ const anchor = document.createElement('button');
13
+ act(() => {
14
+ result.current.anchorRef(anchor);
15
+ });
16
+ expect(result.current.positionerProps.anchor.current).toBe(anchor);
17
+
18
+ const clickEvent = {
19
+ stopPropagation: jest.fn(),
20
+ } as unknown as MouseEvent;
21
+
22
+ act(() => {
23
+ result.current.pressTriggerProps.onClick(clickEvent);
24
+ });
25
+
26
+ expect(clickEvent.stopPropagation).toHaveBeenCalled();
27
+ expect(result.current.open).toBe(true);
28
+ expect(result.current.tooltipProps.open).toBe(true);
29
+ });
30
+ });
@@ -1,18 +1,36 @@
1
1
  import {
2
2
  useCallback,
3
+ useRef,
3
4
  useState,
4
5
  type MouseEvent,
5
6
  type PointerEvent,
7
+ type RefCallback,
6
8
  } from 'react';
7
9
 
10
+ /**
11
+ * Click-to-toggle for Base UI tooltips (touch / explicit open).
12
+ *
13
+ * Hover opens through Base UI with the trigger attached synchronously
14
+ * (`flushSync`). A controlled `open` flip from a nested button click does
15
+ * not — `stopPropagation` also blocks `referencePress` dismiss, so Floating UI
16
+ * can mount the positioner with no reference and stick at viewport 0,0.
17
+ *
18
+ * Attach `anchorRef` to the press target and merge `positionerProps` into
19
+ * Tooltip `slotProps.positioner` so click-open stays aligned with the control.
20
+ */
8
21
  export function usePressTooltip(defaultOpen = false) {
9
22
  const [open, setOpen] = useState(defaultOpen);
23
+ const anchorRef = useRef<HTMLElement | null>(null);
10
24
 
11
25
  const toggleOpen = useCallback((e: MouseEvent | PointerEvent) => {
12
26
  e.stopPropagation();
13
27
  setOpen(prev => !prev);
14
28
  }, []);
15
29
 
30
+ const setAnchorRef = useCallback<RefCallback<HTMLElement>>(node => {
31
+ anchorRef.current = node;
32
+ }, []);
33
+
16
34
  const pressTriggerProps = {
17
35
  onPointerDown: (e: PointerEvent) => {
18
36
  e.stopPropagation();
@@ -20,10 +38,22 @@ export function usePressTooltip(defaultOpen = false) {
20
38
  onClick: toggleOpen,
21
39
  } as const;
22
40
 
41
+ const positionerProps = {
42
+ anchor: anchorRef,
43
+ positionMethod: 'fixed' as const,
44
+ };
45
+
23
46
  const tooltipProps = {
24
47
  open,
25
48
  onOpenChange: setOpen,
26
49
  } as const;
27
50
 
28
- return { open, setOpen, pressTriggerProps, tooltipProps };
51
+ return {
52
+ open,
53
+ setOpen,
54
+ anchorRef: setAnchorRef,
55
+ pressTriggerProps,
56
+ positionerProps,
57
+ tooltipProps,
58
+ };
29
59
  }
package/src/index.tsx CHANGED
@@ -51,7 +51,7 @@ export interface Props {
51
51
  showLogin?: boolean;
52
52
  showUpload?: boolean;
53
53
  showReasoning?: boolean;
54
- /** When true and layout is WEBSITE_ASSISTANT, hide the 3D avatar in the expanded panel. */
54
+ /** When true (default for WEBSITE_ASSISTANT), hide the 3D avatar in the expanded panel. Set false to show it. */
55
55
  avatar3dHidden?: boolean;
56
56
  height?: number | string;
57
57
  baseURL?: string;
@@ -406,16 +406,18 @@
406
406
  "otpTitle": "Bestätigungscode eingeben",
407
407
  "otpDescription": "Geben Sie den 4-stelligen Code ein, den Sie in Ihrem Konto generiert haben",
408
408
  "otpStep1": "Klicken Sie auf die Schaltfläche unten, um Ihr Konto zu öffnen",
409
- "otpStep2": "Generieren Sie einen 4-stelligen Bestätigungscode (60 Sekunden gültig)",
409
+ "otpStep2": "Generieren Sie einen 4-stelligen Bestätigungscode (5 Minuten gültig)",
410
410
  "otpStep3": "Kehren Sie hierher zurück und geben Sie den Code ein",
411
411
  "startOtpLogin": "Verifizierung starten",
412
412
  "generateOtp": "Code generieren",
413
- "otpTimer": "Code läuft in {{seconds}} Sekunden ab",
413
+ "otpTimer": "Code läuft in {{time}} ab",
414
414
  "otpInvalidFormat": "Bitte geben Sie einen gültigen 4-stelligen Code ein",
415
415
  "otpInvalid": "Ungültiger Bestätigungscode",
416
416
  "otpExpired": "Der Bestätigungscode ist abgelaufen",
417
417
  "otpError": "Fehler bei der Code-Validierung. Bitte versuchen Sie es erneut.",
418
418
  "otpSuccess": "Anmeldung erfolgreich!",
419
+ "otpAttemptsExceeded": "Zu viele Versuche. Fordern Sie einen neuen Bestätigungscode an.",
420
+ "resendOtpIn": "Erneut senden in {{seconds}}s",
419
421
  "password": "Passwort",
420
422
  "newPassword": "Neues Passwort",
421
423
  "confirmPassword": "Passwort bestätigen",
@@ -551,6 +553,10 @@
551
553
  "SESSION_NOT_FOUND": "Sitzung nicht gefunden",
552
554
  "SESSION_IS_NOT_ADMINISTRATIVE": "Nicht-administrative Sitzung",
553
555
  "SESSION_EXPIRED": "Sitzung abgelaufen",
556
+ "SESSION_OTP_NOT_FOUND": "Bestätigungscode nicht gefunden",
557
+ "SESSION_OTP_EXPIRED": "Der Bestätigungscode ist abgelaufen",
558
+ "SESSION_OTP_INVALID": "Ungültiger Bestätigungscode",
559
+ "SESSION_OTP_ATTEMPTS_EXCEEDED": "Zu viele Versuche. Fordern Sie einen neuen Bestätigungscode an.",
554
560
 
555
561
  "MEMORI_MISSING_CONFIGURATION": "Zwilling: fehlende Konfiguration",
556
562
  "MEMORI_CONFIGURATION_NOT_FOUND": "Zwilling: Konfiguration nicht gefunden",
@@ -433,11 +433,11 @@
433
433
  "otpTitle": "Enter verification code",
434
434
  "otpDescription": "Enter the 4-digit code you generated in your account",
435
435
  "otpStep1": "Click the button below to open your account",
436
- "otpStep2": "Generate a 4-digit verification code (valid for 60 seconds)",
436
+ "otpStep2": "Generate a 4-digit verification code (valid for 5 minutes)",
437
437
  "otpStep3": "Return here and enter the code",
438
438
  "startOtpLogin": "Start verification",
439
439
  "generateOtp": "Generate code",
440
- "otpTimer": "Code expires in {{seconds}} seconds",
440
+ "otpTimer": "Code expires in {{time}}",
441
441
  "otpInvalidFormat": "Please enter a valid 4-digit code",
442
442
  "otpInvalid": "Invalid verification code",
443
443
  "otpError": "Error validating code. Please try again.",
@@ -448,6 +448,7 @@
448
448
  "emailPlaceholder": "Enter your email",
449
449
  "sendOtp": "Send code",
450
450
  "resendOtp": "Resend code",
451
+ "resendOtpIn": "Resend in {{seconds}}s",
451
452
  "resending": "Resending...",
452
453
  "backToEmail": "Back to email",
453
454
  "otpSent": "Verification code sent!",
@@ -458,6 +459,7 @@
458
459
  "otpNotFound": "Verification code not found",
459
460
  "otpExpired": "Verification code has expired",
460
461
  "otpMissing": "Verification code is required",
462
+ "otpAttemptsExceeded": "Too many attempts. Request a new verification code.",
461
463
  "otpSuccessMessage": "Verification successful! Redirecting...",
462
464
  "otpSuccessDescription": "Your account has been verified successfully. You will be redirected shortly.",
463
465
  "otpHelp": "Enter the 4-digit code from your email",
@@ -623,7 +625,8 @@
623
625
  "SESSION_EXPIRED": "Session expired",
624
626
  "SESSION_OTP_NOT_FOUND": "Verification code not found",
625
627
  "SESSION_OTP_EXPIRED": "Verification code has expired",
626
- "SESSION_MISSING_TEMPORARY_TOKEN": "Verification code is required",
628
+ "SESSION_OTP_INVALID": "Invalid verification code",
629
+ "SESSION_OTP_ATTEMPTS_EXCEEDED": "Too many attempts. Request a new verification code.",
627
630
 
628
631
  "MEMORI_MISSING_CONFIGURATION": "Agent: missing configuration",
629
632
  "MEMORI_CONFIGURATION_NOT_FOUND": "Agent: configuration not found",
@@ -405,11 +405,11 @@
405
405
  "otpTitle": "Ingresa el código de verificación",
406
406
  "otpDescription": "Ingresa el código de 4 dígitos que generaste en tu cuenta",
407
407
  "otpStep1": "Haz clic en el botón de abajo para abrir tu cuenta",
408
- "otpStep2": "Genera un código de verificación de 4 dígitos (válido por 60 segundos)",
408
+ "otpStep2": "Genera un código de verificación de 4 dígitos (válido por 5 minutos)",
409
409
  "otpStep3": "Regresa aquí e ingresa el código",
410
410
  "startOtpLogin": "Iniciar verificación",
411
411
  "generateOtp": "Generar código",
412
- "otpTimer": "El código expira en {{seconds}} segundos",
412
+ "otpTimer": "El código expira en {{time}}",
413
413
  "otpInvalidFormat": "Por favor ingresa un código válido de 4 dígitos",
414
414
  "otpInvalid": "Código de verificación inválido",
415
415
  "otpError": "Error al validar el código. Por favor intenta de nuevo.",
@@ -420,6 +420,7 @@
420
420
  "emailPlaceholder": "Ingresa tu email",
421
421
  "sendOtp": "Enviar código",
422
422
  "resendOtp": "Reenviar código",
423
+ "resendOtpIn": "Reenviar en {{seconds}}s",
423
424
  "resending": "Reenviando...",
424
425
  "backToEmail": "Volver al email",
425
426
  "otpSent": "¡Código de verificación enviado!",
@@ -430,6 +431,7 @@
430
431
  "otpNotFound": "Código de verificación no encontrado",
431
432
  "otpExpired": "El código de verificación ha expirado",
432
433
  "otpMissing": "El código de verificación es requerido",
434
+ "otpAttemptsExceeded": "Demasiados intentos. Solicita un nuevo código de verificación.",
433
435
  "otpSuccessMessage": "¡Verificación exitosa! Redirigiendo...",
434
436
  "otpSuccessDescription": "Tu cuenta ha sido verificada exitosamente. Serás redirigido en breve.",
435
437
  "otpHelp": "Ingresa el código de 4 dígitos de tu email",
@@ -574,7 +576,8 @@
574
576
  "SESSION_EXPIRED": "La sesión expiró",
575
577
  "SESSION_OTP_NOT_FOUND": "Código de verificación no encontrado",
576
578
  "SESSION_OTP_EXPIRED": "El código de verificación ha expirado",
577
- "SESSION_MISSING_TEMPORARY_TOKEN": "El código de verificación es requerido",
579
+ "SESSION_OTP_INVALID": "Código de verificación inválido",
580
+ "SESSION_OTP_ATTEMPTS_EXCEEDED": "Demasiados intentos. Solicita un nuevo código de verificación.",
578
581
  "MEMORI_MISSING_CONFIGURATION": "Gemelo: falta configuración",
579
582
  "MEMORI_CONFIGURATION_NOT_FOUND": "Gemelo: configuración no encontrada",
580
583
  "MEMORI_INVALID_PRIVACY_TYPE": "Gemelo: tipo de privacidad no válido",
@@ -405,11 +405,11 @@
405
405
  "otpTitle": "Entrez le code de vérification",
406
406
  "otpDescription": "Entrez le code à 4 chiffres que vous avez généré dans votre compte",
407
407
  "otpStep1": "Cliquez sur le bouton ci-dessous pour ouvrir votre compte",
408
- "otpStep2": "Générez un code de vérification à 4 chiffres (valide pendant 60 secondes)",
408
+ "otpStep2": "Générez un code de vérification à 4 chiffres (valide pendant 5 minutes)",
409
409
  "otpStep3": "Revenez ici et entrez le code",
410
410
  "startOtpLogin": "Commencer la vérification",
411
411
  "generateOtp": "Générer le code",
412
- "otpTimer": "Le code expire dans {{seconds}} secondes",
412
+ "otpTimer": "Le code expire dans {{time}}",
413
413
  "otpInvalidFormat": "Veuillez entrer un code valide à 4 chiffres",
414
414
  "otpInvalid": "Code de vérification invalide",
415
415
  "otpError": "Erreur lors de la validation du code. Veuillez réessayer.",
@@ -420,6 +420,7 @@
420
420
  "emailPlaceholder": "Entrez votre email",
421
421
  "sendOtp": "Envoyer le code",
422
422
  "resendOtp": "Renvoyer le code",
423
+ "resendOtpIn": "Renvoyer dans {{seconds}}s",
423
424
  "resending": "Envoi en cours...",
424
425
  "backToEmail": "Retour à l'email",
425
426
  "otpSent": "Code de vérification envoyé !",
@@ -430,6 +431,7 @@
430
431
  "otpNotFound": "Code de vérification introuvable",
431
432
  "otpExpired": "Le code de vérification a expiré",
432
433
  "otpMissing": "Le code de vérification est requis",
434
+ "otpAttemptsExceeded": "Trop de tentatives. Demandez un nouveau code de vérification.",
433
435
  "otpSuccessMessage": "Vérification réussie ! Redirection...",
434
436
  "otpSuccessDescription": "Votre compte a été vérifié avec succès. Vous allez être redirigé sous peu.",
435
437
  "otpHelp": "Entrez le code à 4 chiffres de votre email",
@@ -574,7 +576,8 @@
574
576
  "SESSION_EXPIRED": "Session expirée",
575
577
  "SESSION_OTP_NOT_FOUND": "Code de vérification introuvable",
576
578
  "SESSION_OTP_EXPIRED": "Le code de vérification a expiré",
577
- "SESSION_MISSING_TEMPORARY_TOKEN": "Le code de vérification est requis",
579
+ "SESSION_OTP_INVALID": "Code de vérification invalide",
580
+ "SESSION_OTP_ATTEMPTS_EXCEEDED": "Trop de tentatives. Demandez un nouveau code de vérification.",
578
581
  "MEMORI_MISSING_CONFIGURATION": "Agent : configuration manquante",
579
582
  "MEMORI_CONFIGURATION_NOT_FOUND": "Agent : configuration introuvable",
580
583
  "MEMORI_INVALID_PRIVACY_TYPE": "Agent : type de confidentialité non valide",
@@ -432,11 +432,11 @@
432
432
  "otpTitle": "Inserisci il codice di verifica",
433
433
  "otpDescription": "Inserisci il codice a 4 cifre che hai generato nel tuo account",
434
434
  "otpStep1": "Clicca il pulsante qui sotto per aprire il tuo account",
435
- "otpStep2": "Genera un codice di verifica a 4 cifre (valido per 60 secondi)",
435
+ "otpStep2": "Genera un codice di verifica a 4 cifre (valido per 5 minuti)",
436
436
  "otpStep3": "Torna qui e inserisci il codice",
437
437
  "startOtpLogin": "Inizia verifica",
438
438
  "generateOtp": "Genera codice",
439
- "otpTimer": "Il codice scade tra {{seconds}} secondi",
439
+ "otpTimer": "Il codice scade tra {{time}}",
440
440
  "otpInvalidFormat": "Inserisci un codice valido a 4 cifre",
441
441
  "otpInvalid": "Codice di verifica non valido",
442
442
  "otpError": "Errore nella validazione del codice. Riprova.",
@@ -447,6 +447,7 @@
447
447
  "emailPlaceholder": "Inserisci la tua email",
448
448
  "sendOtp": "Invia codice",
449
449
  "resendOtp": "Invia di nuovo",
450
+ "resendOtpIn": "Reinvia tra {{seconds}}s",
450
451
  "resending": "Invio in corso...",
451
452
  "backToEmail": "Torna all'email",
452
453
  "otpSent": "Codice di verifica inviato!",
@@ -457,6 +458,7 @@
457
458
  "otpNotFound": "Codice di verifica non trovato",
458
459
  "otpExpired": "Il codice di verifica è scaduto",
459
460
  "otpMissing": "Il codice di verifica è richiesto",
461
+ "otpAttemptsExceeded": "Troppi tentativi. Richiedi un nuovo codice di verifica.",
460
462
  "otpSuccessMessage": "Verifica completata! Reindirizzamento...",
461
463
  "otpSuccessDescription": "Il tuo account è stato verificato con successo. Sarai reindirizzato a breve.",
462
464
  "otpHelp": "Inserisci il codice a 4 cifre dalla tua email",
@@ -619,7 +621,8 @@
619
621
  "SESSION_EXPIRED": "Sessione scaduta",
620
622
  "SESSION_OTP_NOT_FOUND": "Codice di verifica non trovato",
621
623
  "SESSION_OTP_EXPIRED": "Il codice di verifica è scaduto",
622
- "SESSION_MISSING_TEMPORARY_TOKEN": "Il codice di verifica è richiesto",
624
+ "SESSION_OTP_INVALID": "Codice di verifica non valido",
625
+ "SESSION_OTP_ATTEMPTS_EXCEEDED": "Troppi tentativi. Richiedi un nuovo codice di verifica.",
623
626
 
624
627
  "MEMORI_MISSING_CONFIGURATION": "Agente: configurazione mancante",
625
628
  "MEMORI_CONFIGURATION_NOT_FOUND": "Agente: configurazione non trovata",
@@ -0,0 +1,52 @@
1
+ /* eslint-env node */
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+
5
+ /**
6
+ * Embeds set `--memori-primary-color` on `.memori-widget`, not always on `:root`.
7
+ * CSS custom properties resolve `var()` when the custom property itself is
8
+ * computed, so derived tokens defined only on `:root` stay frozen to the
9
+ * default brand. Disabled / soft / subtle UI uses those derived tokens
10
+ * (`--memori-primary-disabled`, etc.), so the host must rebind them on the
11
+ * same scopes as `--memori-primary`.
12
+ */
13
+ describe('brand token cascade (styles.css)', () => {
14
+ const css = fs.readFileSync(path.join(__dirname, 'styles.css'), 'utf8');
15
+
16
+ const overridesBlocks = [
17
+ ...css.matchAll(/@layer\s+memori\.overrides\s*\{([\s\S]*?)\n\}/g),
18
+ ].map(match => match[1]);
19
+
20
+ it('rebinds primary-derived tokens next to --memori-primary on host scopes', () => {
21
+ const lightBlock = overridesBlocks.find(
22
+ block =>
23
+ block.includes('.memori-widget') &&
24
+ block.includes('--memori-primary:') &&
25
+ !block.includes("data-theme='dark'")
26
+ );
27
+
28
+ expect(lightBlock).toBeDefined();
29
+ expect(lightBlock).toMatch(/--memori-primary-disabled\s*:/);
30
+ expect(lightBlock).toMatch(/--memori-primary-hover\s*:/);
31
+ expect(lightBlock).toMatch(/--memori-primary-subtle\s*:/);
32
+ expect(lightBlock).toMatch(/--memori-border-primary\s*:/);
33
+ expect(lightBlock).toMatch(
34
+ /--memori-primary-disabled\s*:\s*color-mix\(in oklch,\s*var\(--memori-primary\)/
35
+ );
36
+ });
37
+
38
+ it('rebinds dark primary-derived tokens on dark host scopes', () => {
39
+ const darkBlock = overridesBlocks.find(
40
+ block =>
41
+ block.includes("data-theme='dark'") &&
42
+ block.includes('.memori-widget')
43
+ );
44
+
45
+ expect(darkBlock).toBeDefined();
46
+ expect(darkBlock).toMatch(/--memori-primary-disabled\s*:/);
47
+ expect(darkBlock).toMatch(/--memori-primary-hover\s*:/);
48
+ expect(darkBlock).toMatch(
49
+ /--memori-primary-disabled\s*:\s*color-mix\(in oklch,\s*var\(--memori-primary\)/
50
+ );
51
+ });
52
+ });