@memori.ai/memori-react 8.15.1 → 8.16.0

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 (166) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/components/Chat/Chat.css +2 -1
  3. package/dist/components/Chat/Chat.js +17 -17
  4. package/dist/components/Chat/Chat.js.map +1 -1
  5. package/dist/components/ChatBubble/ChatBubble.css +1 -1
  6. package/dist/components/ContentPreviewModal/ContentPreviewModal.css +114 -0
  7. package/dist/components/ContentPreviewModal/ContentPreviewModal.d.ts +14 -0
  8. package/dist/components/ContentPreviewModal/ContentPreviewModal.js +18 -0
  9. package/dist/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -0
  10. package/dist/components/ContentPreviewModal/index.d.ts +2 -0
  11. package/dist/components/ContentPreviewModal/index.js +9 -0
  12. package/dist/components/ContentPreviewModal/index.js.map +1 -0
  13. package/dist/components/FilePreview/FilePreview.css +1 -1
  14. package/dist/components/FilePreview/FilePreview.js +43 -13
  15. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  16. package/dist/components/MediaWidget/DocumentCard.d.ts +3 -0
  17. package/dist/components/MediaWidget/DocumentCard.js +9 -0
  18. package/dist/components/MediaWidget/DocumentCard.js.map +1 -0
  19. package/dist/components/MediaWidget/MediaItemWidget.css +946 -19
  20. package/dist/components/MediaWidget/MediaItemWidget.d.ts +5 -36
  21. package/dist/components/MediaWidget/MediaItemWidget.js +295 -198
  22. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  23. package/dist/components/MediaWidget/MediaItemWidget.types.d.ts +62 -0
  24. package/dist/components/MediaWidget/MediaItemWidget.types.js +3 -0
  25. package/dist/components/MediaWidget/MediaItemWidget.types.js.map +1 -0
  26. package/dist/components/MediaWidget/MediaItemWidget.utils.d.ts +23 -0
  27. package/dist/components/MediaWidget/MediaItemWidget.utils.js +162 -0
  28. package/dist/components/MediaWidget/MediaItemWidget.utils.js.map +1 -0
  29. package/dist/components/MediaWidget/MediaPreviewModal.d.ts +15 -0
  30. package/dist/components/MediaWidget/MediaPreviewModal.js +162 -0
  31. package/dist/components/MediaWidget/MediaPreviewModal.js.map +1 -0
  32. package/dist/components/MediaWidget/MediaWidget.js +1 -2
  33. package/dist/components/MediaWidget/MediaWidget.js.map +1 -1
  34. package/dist/components/Snippet/Snippet.css +64 -33
  35. package/dist/components/Snippet/Snippet.js +17 -4
  36. package/dist/components/Snippet/Snippet.js.map +1 -1
  37. package/dist/components/StartPanel/StartPanel.js +1 -2
  38. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  39. package/dist/components/UploadButton/UploadButton.css +0 -5
  40. package/dist/components/layouts/WebsiteAssistant.js +8 -8
  41. package/dist/components/layouts/WebsiteAssistant.js.map +1 -1
  42. package/dist/components/layouts/chat.css +1 -1
  43. package/dist/components/layouts/website-assistant.css +405 -197
  44. package/dist/helpers/constants.js +0 -7
  45. package/dist/helpers/constants.js.map +1 -1
  46. package/dist/helpers/utils.d.ts +1 -0
  47. package/dist/helpers/utils.js +3 -1
  48. package/dist/helpers/utils.js.map +1 -1
  49. package/dist/index.js +43 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/styles.css +0 -2
  52. package/dist/version.d.ts +1 -0
  53. package/dist/version.js +5 -0
  54. package/dist/version.js.map +1 -0
  55. package/esm/components/Chat/Chat.css +2 -1
  56. package/esm/components/Chat/Chat.js +17 -17
  57. package/esm/components/Chat/Chat.js.map +1 -1
  58. package/esm/components/ChatBubble/ChatBubble.css +1 -1
  59. package/esm/components/ContentPreviewModal/ContentPreviewModal.css +114 -0
  60. package/esm/components/ContentPreviewModal/ContentPreviewModal.d.ts +14 -0
  61. package/esm/components/ContentPreviewModal/ContentPreviewModal.js +15 -0
  62. package/esm/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -0
  63. package/esm/components/ContentPreviewModal/index.d.ts +2 -0
  64. package/esm/components/ContentPreviewModal/index.js +2 -0
  65. package/esm/components/ContentPreviewModal/index.js.map +1 -0
  66. package/esm/components/FilePreview/FilePreview.css +1 -1
  67. package/esm/components/FilePreview/FilePreview.js +44 -14
  68. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  69. package/esm/components/MediaWidget/DocumentCard.d.ts +3 -0
  70. package/esm/components/MediaWidget/DocumentCard.js +5 -0
  71. package/esm/components/MediaWidget/DocumentCard.js.map +1 -0
  72. package/esm/components/MediaWidget/MediaItemWidget.css +946 -19
  73. package/esm/components/MediaWidget/MediaItemWidget.d.ts +5 -36
  74. package/esm/components/MediaWidget/MediaItemWidget.js +296 -197
  75. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  76. package/esm/components/MediaWidget/MediaItemWidget.types.d.ts +62 -0
  77. package/esm/components/MediaWidget/MediaItemWidget.types.js +2 -0
  78. package/esm/components/MediaWidget/MediaItemWidget.types.js.map +1 -0
  79. package/esm/components/MediaWidget/MediaItemWidget.utils.d.ts +23 -0
  80. package/esm/components/MediaWidget/MediaItemWidget.utils.js +149 -0
  81. package/esm/components/MediaWidget/MediaItemWidget.utils.js.map +1 -0
  82. package/esm/components/MediaWidget/MediaPreviewModal.d.ts +15 -0
  83. package/esm/components/MediaWidget/MediaPreviewModal.js +157 -0
  84. package/esm/components/MediaWidget/MediaPreviewModal.js.map +1 -0
  85. package/esm/components/MediaWidget/MediaWidget.js +1 -2
  86. package/esm/components/MediaWidget/MediaWidget.js.map +1 -1
  87. package/esm/components/Snippet/Snippet.css +64 -33
  88. package/esm/components/Snippet/Snippet.js +18 -5
  89. package/esm/components/Snippet/Snippet.js.map +1 -1
  90. package/esm/components/StartPanel/StartPanel.js +1 -2
  91. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  92. package/esm/components/UploadButton/UploadButton.css +0 -5
  93. package/esm/components/layouts/WebsiteAssistant.js +8 -8
  94. package/esm/components/layouts/WebsiteAssistant.js.map +1 -1
  95. package/esm/components/layouts/chat.css +1 -1
  96. package/esm/components/layouts/website-assistant.css +405 -197
  97. package/esm/helpers/constants.js +0 -7
  98. package/esm/helpers/constants.js.map +1 -1
  99. package/esm/helpers/utils.d.ts +1 -0
  100. package/esm/helpers/utils.js +1 -0
  101. package/esm/helpers/utils.js.map +1 -1
  102. package/esm/index.js +43 -1
  103. package/esm/index.js.map +1 -1
  104. package/esm/styles.css +0 -2
  105. package/esm/version.d.ts +1 -0
  106. package/esm/version.js +2 -0
  107. package/esm/version.js.map +1 -0
  108. package/package.json +5 -3
  109. package/src/components/Chat/Chat.css +2 -1
  110. package/src/components/Chat/Chat.stories.tsx +124 -0
  111. package/src/components/Chat/Chat.tsx +72 -71
  112. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +567 -1034
  113. package/src/components/ChatBubble/ChatBubble.css +1 -1
  114. package/src/components/ContentPreviewModal/ContentPreviewModal.css +114 -0
  115. package/src/components/ContentPreviewModal/ContentPreviewModal.tsx +69 -0
  116. package/src/components/ContentPreviewModal/index.ts +2 -0
  117. package/src/components/FilePreview/FilePreview.css +1 -1
  118. package/src/components/FilePreview/FilePreview.tsx +60 -37
  119. package/src/components/FilePreview/__snapshots__/FilePreview.test.tsx.snap +15 -105
  120. package/src/components/MediaWidget/DocumentCard.test.tsx +45 -0
  121. package/src/components/MediaWidget/DocumentCard.tsx +19 -0
  122. package/src/components/MediaWidget/MediaItemWidget.css +946 -19
  123. package/src/components/MediaWidget/MediaItemWidget.test.tsx +89 -1
  124. package/src/components/MediaWidget/MediaItemWidget.tsx +734 -461
  125. package/src/components/MediaWidget/MediaItemWidget.types.ts +65 -0
  126. package/src/components/MediaWidget/MediaItemWidget.utils.test.ts +324 -0
  127. package/src/components/MediaWidget/MediaItemWidget.utils.ts +194 -0
  128. package/src/components/MediaWidget/MediaPreviewModal.test.tsx +271 -0
  129. package/src/components/MediaWidget/MediaPreviewModal.tsx +423 -0
  130. package/src/components/MediaWidget/MediaWidget.stories.tsx +193 -0
  131. package/src/components/MediaWidget/MediaWidget.tsx +2 -4
  132. package/src/components/MediaWidget/__snapshots__/DocumentCard.test.tsx.snap +24 -0
  133. package/src/components/MediaWidget/__snapshots__/MediaItemWidget.test.tsx.snap +162 -170
  134. package/src/components/MediaWidget/__snapshots__/MediaWidget.test.tsx.snap +21 -63
  135. package/src/components/Snippet/Snippet.css +64 -33
  136. package/src/components/Snippet/Snippet.tsx +30 -21
  137. package/src/components/Snippet/__snapshots__/Snippet.test.tsx.snap +314 -297
  138. package/src/components/StartPanel/StartPanel.tsx +0 -9
  139. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +12 -636
  140. package/src/components/UploadButton/UploadButton.css +0 -5
  141. package/src/components/layouts/WebsiteAssistant.tsx +66 -62
  142. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +1 -53
  143. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +2 -106
  144. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +1 -53
  145. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +1 -53
  146. package/src/components/layouts/__snapshots__/WebsiteAssistant.test.tsx.snap +32 -33
  147. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +1 -53
  148. package/src/components/layouts/chat.css +1 -1
  149. package/src/components/layouts/layouts.stories.tsx +68 -0
  150. package/src/components/layouts/website-assistant.css +405 -197
  151. package/src/helpers/constants.ts +0 -7
  152. package/src/helpers/utils.ts +4 -0
  153. package/src/index.test.tsx +8 -0
  154. package/src/index.tsx +51 -1
  155. package/src/styles.css +0 -2
  156. package/src/version.ts +2 -0
  157. package/src/components/AttachmentLinkModal/AttachmentLinkModal.css +0 -68
  158. package/src/components/AttachmentLinkModal/AttachmentLinkModal.stories.tsx +0 -32
  159. package/src/components/AttachmentLinkModal/AttachmentLinkModal.test.tsx +0 -10
  160. package/src/components/AttachmentLinkModal/AttachmentLinkModal.tsx +0 -131
  161. package/src/components/AttachmentLinkModal/__snapshots__/AttachmentLinkModal.test.tsx.snap +0 -9
  162. package/src/components/MediaWidget/LinkItemWidget.css +0 -46
  163. package/src/components/MediaWidget/LinkItemWidget.stories.tsx +0 -61
  164. package/src/components/MediaWidget/LinkItemWidget.test.tsx +0 -33
  165. package/src/components/MediaWidget/LinkItemWidget.tsx +0 -204
  166. package/src/components/MediaWidget/__snapshots__/LinkItemWidget.test.tsx.snap +0 -253
@@ -1,6 +1,8 @@
1
1
  .memori-snippet {
2
2
  position: relative;
3
3
  overflow: hidden;
4
+ width: 100%;
5
+ min-width: 0;
4
6
  border: 1px solid #e5e7eb;
5
7
  border-radius: 0.5rem;
6
8
  background: #f8fafc;
@@ -9,10 +11,13 @@
9
11
  .memori-snippet--content {
10
12
  position: relative;
11
13
  display: flex;
14
+ width: 100%;
15
+ min-width: 0;
12
16
  flex-direction: column;
13
17
  }
14
18
 
15
19
  .memori-snippet pre {
20
+ min-width: 0;
16
21
  padding: 1rem;
17
22
  border: none;
18
23
  border-radius: 0;
@@ -22,8 +27,31 @@
22
27
  font-size: 0.875rem;
23
28
  line-height: 1.6;
24
29
  overflow-x: auto;
30
+ white-space: pre-wrap;
31
+ word-break: break-word;
32
+ word-wrap: break-word;
25
33
  }
26
34
 
35
+ pre[class*="language-"] {
36
+ margin: 0 !important;
37
+ }
38
+ /* Preview mode: full content with max height and scroll */
39
+ .memori-snippet--preview .memori-snippet--content {
40
+ display: flex;
41
+ overflow: hidden;
42
+ max-height: 200px;
43
+ flex-direction: column;
44
+ }
45
+
46
+ .memori-snippet--preview .memori-snippet--content pre {
47
+ min-height: 0;
48
+ flex: 1;
49
+ overflow-x: hidden;
50
+ overflow-y: auto;
51
+ }
52
+
53
+
54
+
27
55
  .memori-snippet code {
28
56
  padding: 0;
29
57
  border-radius: 0;
@@ -32,11 +60,26 @@
32
60
  font-family: inherit;
33
61
  }
34
62
 
35
- button.memori-snippet--copy-button {
63
+ .memori-snippet--copy-wrapper {
36
64
  position: absolute;
37
65
  z-index: 10;
38
66
  top: 0.5rem;
39
67
  right: 0.5rem;
68
+ display: flex;
69
+ align-items: center;
70
+ padding: 0.5rem;
71
+ border: 1px solid rgba(0, 0, 0, 0.1);
72
+ border-radius: 0.5rem;
73
+ border-radius: 6px;
74
+ -webkit-backdrop-filter: blur(10px);
75
+ backdrop-filter: blur(10px);
76
+ background: rgba(0, 0, 0, 0.05);
77
+ background-color: #f8fafc;
78
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
79
+ gap: 0.5rem;
80
+ }
81
+
82
+ button.memori-snippet--copy-button {
40
83
  width: 32px !important;
41
84
  height: 32px !important;
42
85
  padding: 0;
@@ -64,6 +107,26 @@ button.memori-snippet--copy-button svg {
64
107
  color: #6b7280;
65
108
  }
66
109
 
110
+ .memori-snippet--copied-text {
111
+ animation: fadeInOut 0.3s ease;
112
+ color: #10b981;
113
+ font-size: 0.75rem;
114
+ font-weight: 600;
115
+ letter-spacing: 0.05em;
116
+ text-transform: uppercase;
117
+ }
118
+
119
+ @keyframes fadeInOut {
120
+ 0% {
121
+ opacity: 0;
122
+ transform: translateX(-4px);
123
+ }
124
+ 100% {
125
+ opacity: 1;
126
+ transform: translateX(0);
127
+ }
128
+ }
129
+
67
130
  .memori-snippet--caption {
68
131
  width: 100%;
69
132
  padding: 0.75rem 1rem;
@@ -77,35 +140,3 @@ button.memori-snippet--copy-button svg {
77
140
  text-align: left;
78
141
  }
79
142
 
80
- /* Dark theme support */
81
- @media (prefers-color-scheme: dark) {
82
- .memori-snippet {
83
- border-color: #374151;
84
- background: #1e1e1e;
85
- }
86
-
87
- .memori-snippet code {
88
- color: #e5e7eb;
89
- }
90
-
91
- .memori-snippet--copy-button {
92
- border-color: rgba(255, 255, 255, 0.2);
93
- background: rgba(255, 255, 255, 0.1);
94
- }
95
-
96
- .memori-snippet--copy-button:hover,
97
- .memori-snippet--copy-button:focus {
98
- border-color: rgba(255, 255, 255, 0.3);
99
- background: rgba(255, 255, 255, 0.2);
100
- }
101
-
102
- .memori-snippet--copy-button svg {
103
- color: #fff;
104
- }
105
-
106
- .memori-snippet--caption {
107
- border-top-color: rgba(255, 255, 255, 0.1);
108
- background: rgba(0, 0, 0, 0.1);
109
- color: #ccc;
110
- }
111
- }
@@ -1,4 +1,4 @@
1
- import React, { useEffect } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import { Medium } from '@memori.ai/memori-api-client/dist/types';
3
3
  import Button from '../ui/Button';
4
4
  import Copy from '../icons/Copy';
@@ -64,6 +64,7 @@ const Snippet = ({
64
64
  showCopyButton = true,
65
65
  }: Props) => {
66
66
  const { t } = useTranslation();
67
+ const [copied, setCopied] = useState(false);
67
68
 
68
69
  const highlightCode = () => {
69
70
  // @ts-ignore
@@ -88,8 +89,21 @@ const Snippet = ({
88
89
  highlightCode();
89
90
  }, [medium.content, medium.mimeType]);
90
91
 
92
+ const handleCopy = async () => {
93
+ const contentToCopy = stripDocumentAttachmentTags(medium.content ?? '');
94
+ try {
95
+ await navigator.clipboard.writeText(contentToCopy);
96
+ setCopied(true);
97
+ setTimeout(() => {
98
+ setCopied(false);
99
+ }, 2000);
100
+ } catch (error) {
101
+ console.error('Failed to copy text:', error);
102
+ }
103
+ };
104
+
91
105
  return (
92
- <div className="memori-snippet">
106
+ <div className={cx('memori-snippet', { 'memori-snippet--preview': preview })}>
93
107
  <div className="memori-snippet--content">
94
108
  <pre
95
109
  className={cx('line-numbers', className)}
@@ -107,31 +121,26 @@ const Snippet = ({
107
121
  ?.lang ?? 'text'
108
122
  }
109
123
  >
110
- {medium.content?.length && medium.content.length > 200 && preview
111
- ? `${stripDocumentAttachmentTags(medium.content)?.slice(0, 200)}\n...`
112
- : stripDocumentAttachmentTags(medium.content ?? '')}
124
+ {stripDocumentAttachmentTags(medium.content ?? '')}
113
125
  </code>
114
126
  </pre>
115
127
 
116
128
  {showCopyButton && (
117
- <Button
118
- padded={false}
119
- ghost
120
- className="memori-snippet--copy-button"
121
- title={t('copy') || 'Copy'}
122
- icon={<Copy />}
123
- onClick={() => navigator.clipboard.writeText(medium.content ?? '')}
124
- />
129
+ <div className="memori-snippet--copy-wrapper">
130
+ {copied && (
131
+ <span className="memori-snippet--copied-text">{t('copied') || 'Copied!'}</span>
132
+ )}
133
+ <Button
134
+ padded={false}
135
+ ghost
136
+ className="memori-snippet--copy-button"
137
+ title={t('copy') || 'Copy'}
138
+ icon={<Copy />}
139
+ onClick={handleCopy}
140
+ />
141
+ </div>
125
142
  )}
126
143
  </div>
127
- {!!medium.title?.length && (
128
- <p
129
- id={`snippet-${medium.mediumID}`}
130
- className="memori-snippet--caption"
131
- >
132
- {medium.title}
133
- </p>
134
- )}
135
144
  </div>
136
145
  );
137
146
  };