@memori.ai/memori-react 8.12.0 → 8.13.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 (135) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/components/Chat/Chat.css +37 -3
  3. package/dist/components/Chat/Chat.js +60 -22
  4. package/dist/components/Chat/Chat.js.map +1 -1
  5. package/dist/components/ChatBubble/ChatBubble.css +9 -5
  6. package/dist/components/ChatBubble/ChatBubble.js +54 -11
  7. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  8. package/dist/components/ChatInputs/ChatInputs.css +293 -17
  9. package/dist/components/ChatInputs/ChatInputs.js +41 -25
  10. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  11. package/dist/components/ChatTextArea/ChatTextArea.css +75 -31
  12. package/dist/components/ChatTextArea/ChatTextArea.js +47 -18
  13. package/dist/components/ChatTextArea/ChatTextArea.js.map +1 -1
  14. package/dist/components/FilePreview/FilePreview.css +225 -146
  15. package/dist/components/FilePreview/FilePreview.d.ts +1 -2
  16. package/dist/components/FilePreview/FilePreview.js +20 -6
  17. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  18. package/dist/components/Header/Header.css +2 -2
  19. package/dist/components/MediaWidget/MediaItemWidget.js +2 -1
  20. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  21. package/dist/components/MediaWidget/MediaWidget.css +0 -4
  22. package/dist/components/MemoriWidget/MemoriWidget.css +11 -2
  23. package/dist/components/MemoriWidget/MemoriWidget.js +41 -5
  24. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  25. package/dist/components/MicrophoneButton/MicrophoneButton.css +2 -2
  26. package/dist/components/StartPanel/StartPanel.css +8 -0
  27. package/dist/components/UploadButton/UploadButton.css +20 -17
  28. package/dist/components/UploadButton/UploadButton.js +218 -89
  29. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  30. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +14 -4
  31. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  32. package/dist/components/UploadButton/UploadImages/UploadImages.js +143 -16
  33. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  34. package/dist/components/layouts/chat.css +1 -1
  35. package/dist/helpers/constants.d.ts +1 -0
  36. package/dist/helpers/constants.js +2 -1
  37. package/dist/helpers/constants.js.map +1 -1
  38. package/dist/helpers/imageCompression.d.ts +7 -0
  39. package/dist/helpers/imageCompression.js +123 -0
  40. package/dist/helpers/imageCompression.js.map +1 -0
  41. package/dist/locales/de.json +7 -4
  42. package/dist/locales/en.json +8 -5
  43. package/dist/locales/es.json +7 -4
  44. package/dist/locales/fr.json +7 -4
  45. package/dist/locales/it.json +8 -5
  46. package/dist/styles.css +1 -2
  47. package/esm/components/Chat/Chat.css +37 -3
  48. package/esm/components/Chat/Chat.js +60 -22
  49. package/esm/components/Chat/Chat.js.map +1 -1
  50. package/esm/components/ChatBubble/ChatBubble.css +9 -5
  51. package/esm/components/ChatBubble/ChatBubble.js +54 -11
  52. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  53. package/esm/components/ChatInputs/ChatInputs.css +293 -17
  54. package/esm/components/ChatInputs/ChatInputs.js +42 -26
  55. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  56. package/esm/components/ChatTextArea/ChatTextArea.css +75 -31
  57. package/esm/components/ChatTextArea/ChatTextArea.js +49 -20
  58. package/esm/components/ChatTextArea/ChatTextArea.js.map +1 -1
  59. package/esm/components/FilePreview/FilePreview.css +225 -146
  60. package/esm/components/FilePreview/FilePreview.d.ts +1 -2
  61. package/esm/components/FilePreview/FilePreview.js +21 -7
  62. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  63. package/esm/components/Header/Header.css +2 -2
  64. package/esm/components/MediaWidget/MediaItemWidget.js +2 -1
  65. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  66. package/esm/components/MediaWidget/MediaWidget.css +0 -4
  67. package/esm/components/MemoriWidget/MemoriWidget.css +11 -2
  68. package/esm/components/MemoriWidget/MemoriWidget.js +41 -5
  69. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  70. package/esm/components/MicrophoneButton/MicrophoneButton.css +2 -2
  71. package/esm/components/StartPanel/StartPanel.css +8 -0
  72. package/esm/components/UploadButton/UploadButton.css +20 -17
  73. package/esm/components/UploadButton/UploadButton.js +219 -90
  74. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  75. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +14 -4
  76. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  77. package/esm/components/UploadButton/UploadImages/UploadImages.js +143 -16
  78. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  79. package/esm/components/layouts/chat.css +1 -1
  80. package/esm/helpers/constants.d.ts +1 -0
  81. package/esm/helpers/constants.js +1 -0
  82. package/esm/helpers/constants.js.map +1 -1
  83. package/esm/helpers/imageCompression.d.ts +7 -0
  84. package/esm/helpers/imageCompression.js +119 -0
  85. package/esm/helpers/imageCompression.js.map +1 -0
  86. package/esm/locales/de.json +7 -4
  87. package/esm/locales/en.json +8 -5
  88. package/esm/locales/es.json +7 -4
  89. package/esm/locales/fr.json +7 -4
  90. package/esm/locales/it.json +8 -5
  91. package/esm/styles.css +1 -2
  92. package/package.json +1 -1
  93. package/src/components/Chat/Chat.css +37 -3
  94. package/src/components/Chat/Chat.tsx +89 -21
  95. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +672 -732
  96. package/src/components/ChatBubble/ChatBubble.css +9 -5
  97. package/src/components/ChatBubble/ChatBubble.tsx +111 -20
  98. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +4 -4
  99. package/src/components/ChatInputs/ChatInputs.css +293 -17
  100. package/src/components/ChatInputs/ChatInputs.tsx +144 -87
  101. package/src/components/ChatInputs/__snapshots__/ChatInputs.test.tsx.snap +430 -424
  102. package/src/components/ChatTextArea/ChatTextArea.css +75 -31
  103. package/src/components/ChatTextArea/ChatTextArea.test.tsx +1 -16
  104. package/src/components/ChatTextArea/ChatTextArea.tsx +51 -22
  105. package/src/components/ChatTextArea/__snapshots__/ChatTextArea.test.tsx.snap +9 -72
  106. package/src/components/FilePreview/FilePreview.css +225 -146
  107. package/src/components/FilePreview/FilePreview.tsx +49 -36
  108. package/src/components/FilePreview/__snapshots__/FilePreview.test.tsx.snap +2 -2
  109. package/src/components/Header/Header.css +2 -2
  110. package/src/components/MediaWidget/MediaItemWidget.tsx +2 -1
  111. package/src/components/MediaWidget/MediaWidget.css +0 -4
  112. package/src/components/MemoriWidget/MemoriWidget.css +11 -2
  113. package/src/components/MemoriWidget/MemoriWidget.tsx +61 -12
  114. package/src/components/MicrophoneButton/MicrophoneButton.css +2 -2
  115. package/src/components/StartPanel/StartPanel.css +8 -0
  116. package/src/components/UploadButton/UploadButton.css +20 -17
  117. package/src/components/UploadButton/UploadButton.stories.tsx +247 -35
  118. package/src/components/UploadButton/UploadButton.tsx +280 -175
  119. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +19 -4
  120. package/src/components/UploadButton/UploadImages/UploadImages.tsx +195 -35
  121. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +10 -1
  122. package/src/components/layouts/chat.css +1 -1
  123. package/src/helpers/constants.ts +1 -1
  124. package/src/helpers/imageCompression.ts +230 -0
  125. package/src/locales/de.json +7 -4
  126. package/src/locales/en.json +8 -5
  127. package/src/locales/es.json +7 -4
  128. package/src/locales/fr.json +7 -4
  129. package/src/locales/it.json +8 -5
  130. package/src/styles.css +1 -2
  131. package/src/components/UploadMenu/UploadMenu.css +0 -47
  132. package/src/components/UploadMenu/UploadMenu.stories.tsx +0 -66
  133. package/src/components/UploadMenu/UploadMenu.test.tsx +0 -34
  134. package/src/components/UploadMenu/UploadMenu.tsx +0 -68
  135. package/src/components/UploadMenu/__snapshots__/UploadMenu.test.tsx.snap +0 -137
@@ -1,223 +1,302 @@
1
1
  /* Updated FilePreview Styles */
2
2
 
3
3
  .memori--preview-container {
4
- z-index: 10;
5
- min-width: 100%;
6
- padding: 12px;
7
- border-radius: 8px;
8
- margin-bottom: 12px;
9
- animation: slide-in 0.3s ease;
10
- background: white;
11
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
12
- transition: all 0.3s ease;
4
+ z-index: 10;
5
+ min-width: 100%;
6
+ /* padding: 12px; */
7
+ border-radius: 8px;
8
+ /* margin-bottom: 12px; */
9
+ animation: slide-in 0.3s ease;
10
+ background: white;
11
+ /* box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); */
12
+ transition: all 0.3s ease;
13
13
  }
14
14
 
15
15
  .memori--preview-container.slide-down {
16
- animation: slide-down 0.3s ease;
17
- }
18
-
19
- .memori--absolute-preview {
20
- position: absolute;
21
- z-index: 10;
22
- right: 0;
23
- bottom: 100%;
24
- left: 0;
25
- max-height: 200px;
26
- overflow-y: auto;
16
+ animation: slide-down 0.3s ease;
27
17
  }
28
18
 
29
19
  /* Responsive adjustments for file preview */
30
20
  @media (max-width: 768px) {
31
- .memori--absolute-preview {
32
- max-height: 150px;
33
- }
21
+ .memori--absolute-preview {
22
+ max-height: 150px;
23
+ }
34
24
 
35
- .memori--preview-container {
36
- padding: 8px;
37
- margin-bottom: 8px;
38
- }
25
+ .memori--preview-container {
26
+ padding: 8px;
27
+ margin-bottom: 8px;
28
+ }
39
29
 
40
- .memori--preview-filename {
41
- max-width: 150px;
42
- font-size: 12px;
43
- }
30
+ .memori--preview-filename {
31
+ max-width: 150px;
32
+ font-size: 12px;
33
+ }
34
+
35
+ /* Make remove button always visible on mobile */
36
+ .memori--remove-button {
37
+ opacity: 1 !important;
38
+ transform: scale(1) !important;
39
+ }
40
+
41
+ /* Increase card size for easier interaction */
42
+ .memori--preview-item {
43
+ min-width: 140px;
44
+ min-height: 60px;
45
+ padding: 12px;
46
+ }
47
+
48
+ .memori--preview-icon {
49
+ width: 24px;
50
+ height: 24px;
51
+ }
52
+
53
+ .memori--preview-thumbnail {
54
+ min-width: 50px;
55
+ min-height: 50px;
56
+ }
57
+
58
+ .memori--preview-thumbnail img {
59
+ width: 50px;
60
+ height: 50px;
61
+ object-fit: cover;
62
+ }
44
63
  }
45
64
 
46
65
  @media (max-width: 480px) {
47
- .memori--absolute-preview {
48
- max-height: 120px;
49
- }
66
+ .memori--absolute-preview {
67
+ max-height: 120px;
68
+ }
50
69
 
51
- .memori--preview-container {
52
- padding: 6px;
53
- margin-bottom: 6px;
54
- }
70
+ .memori--preview-container {
71
+ padding: 6px;
72
+ margin-bottom: 6px;
73
+ }
55
74
 
56
- .memori--preview-filename {
57
- max-width: 100px;
58
- font-size: 11px;
59
- }
75
+ .memori--preview-filename {
76
+ max-width: 100px;
77
+ font-size: 11px;
78
+ }
79
+
80
+ /* Make remove button always visible on mobile */
81
+ .memori--remove-button {
82
+ opacity: 1 !important;
83
+ transform: scale(1) !important;
84
+ }
85
+
86
+ /* Increase card size for easier interaction on small screens */
87
+ .memori--preview-item {
88
+ min-width: 160px;
89
+ min-height: 70px;
90
+ padding: 14px;
91
+ }
92
+
93
+ .memori--preview-icon {
94
+ width: 28px;
95
+ height: 28px;
96
+ }
97
+
98
+ .memori--preview-thumbnail {
99
+ min-width: 60px;
100
+ min-height: 60px;
101
+ }
102
+
103
+ .memori--preview-thumbnail img {
104
+ width: 60px;
105
+ height: 60px;
106
+ object-fit: cover;
107
+ }
60
108
  }
61
109
 
62
110
  .memori--message-preview {
63
- max-width: 100%;
64
- margin: 12px 0;
111
+ max-width: 100%;
112
+ margin: 12px 0;
65
113
  }
66
114
 
67
115
  .memori--preview-list {
68
- display: flex;
69
- flex-direction: row;
70
- gap: 8px;
71
- overflow-x: auto;
116
+ display: flex;
117
+ flex-direction: row;
118
+ padding: 0.875rem;
119
+ padding-bottom: 0.625rem;
120
+ gap: 8px;
121
+ overflow-x: auto;
122
+ scrollbar-color: hsla(var(--border-300) / 35%) transparent;
123
+ scrollbar-width: thin;
72
124
  }
73
125
 
74
126
  .memori--preview-item {
75
- position: relative;
76
- display: flex;
77
- max-width: fit-content;
78
- align-items: center;
79
- padding: 8px;
80
- border-radius: 8px;
81
- animation: slide-in 0.3s ease;
82
- background-color: #f8f9fa;
83
- cursor: pointer;
84
- gap: 8px;
85
- transition: all 0.2s ease;
127
+ position: relative;
128
+ display: flex;
129
+ max-width: fit-content;
130
+ align-items: center;
131
+ padding: 8px;
132
+ border-radius: 8px;
133
+ animation: slide-in 0.3s ease;
134
+ background-color: #f8f9fa;
135
+ cursor: pointer;
136
+ gap: 8px;
137
+ transition: all 0.2s ease;
86
138
  }
87
139
 
88
140
  .memori--preview-item:hover {
89
- background-color: #f1f3f5;
90
- transform: translateX(4px);
141
+ background-color: #f1f3f5;
142
+ transform: translateX(4px);
91
143
  }
92
144
 
93
145
  .memori--preview-icon {
94
- width: 20px;
95
- height: 20px;
96
- flex-shrink: 0;
97
- color: #fff;
98
- fill: var(--memori-primary);
146
+ width: 20px;
147
+ height: 20px;
148
+ flex-shrink: 0;
149
+ color: #fff;
150
+ fill: var(--memori-primary);
151
+ }
152
+
153
+ .memori--preview-thumbnail {
154
+ display: flex;
155
+ overflow: hidden;
156
+ flex-shrink: 0;
157
+ align-items: center;
158
+ justify-content: center;
159
+ border-radius: 4px;
160
+ }
161
+
162
+ .memori--preview-thumbnail img {
163
+ width: 40px;
164
+ height: 40px;
165
+ border-radius: 4px;
166
+ object-fit: cover;
99
167
  }
100
168
 
101
169
  .memori--preview-file-info {
102
- display: flex;
103
- overflow: hidden;
104
- flex-direction: column;
170
+ display: flex;
171
+ overflow: hidden;
172
+ flex-direction: column;
173
+ }
174
+
175
+ .memori-modal--title {
176
+ overflow: hidden;
177
+ max-width: 100%;
178
+ text-overflow: ellipsis;
179
+ white-space: nowrap;
105
180
  }
106
181
 
107
182
  .memori--preview-filename {
108
- overflow: hidden;
109
- max-width: 200px;
110
- color: #495057;
111
- font-size: 14px;
112
- font-weight: 500;
113
- text-overflow: ellipsis;
114
- white-space: nowrap;
183
+ overflow: hidden;
184
+ max-width: 100px;
185
+ color: #495057;
186
+ font-size: 14px;
187
+ font-weight: 500;
188
+ text-overflow: ellipsis;
189
+ white-space: nowrap;
115
190
  }
116
191
 
117
192
  .memori--preview-filetype {
118
- margin-top: 2px;
119
- color: #868e96;
120
- font-size: 12px;
193
+ margin-top: 2px;
194
+ color: #868e96;
195
+ font-size: 12px;
121
196
  }
122
197
 
123
198
  .memori--modal-title-preview {
124
- margin-top: 12px;
125
- margin-bottom: 12px;
126
- font-size: 20px;
127
- font-weight: 600;
199
+ margin-top: 12px;
200
+ margin-bottom: 12px;
201
+ font-size: 20px;
202
+ font-weight: 600;
128
203
  }
129
204
 
130
205
  .memori--remove-button {
131
- position: absolute;
132
- top: -4px;
133
- right: -4px;
134
- padding: 4px;
135
- border: none;
136
- border-radius: 50%;
137
- background-color: #e03131;
138
- color: white;
139
- cursor: pointer;
140
- opacity: 0;
141
- transform: scale(0.75);
142
- transition: all 0.2s ease;
206
+ position: absolute;
207
+ top: -4px;
208
+ right: -4px;
209
+ padding: 4px;
210
+ border: none;
211
+ border-radius: 50%;
212
+ background-color: #e03131;
213
+ color: white;
214
+ cursor: pointer;
215
+ opacity: 0;
216
+ transform: scale(0.75);
217
+ transition: all 0.2s ease;
143
218
  }
144
219
 
145
220
  .memori--remove-button.visible {
146
- opacity: 1;
147
- transform: scale(1);
221
+ opacity: 1;
222
+ transform: scale(1);
148
223
  }
149
224
 
150
225
  .memori--remove-button:hover {
151
- background-color: #c92a2a;
152
- transform: scale(1.1);
226
+ background-color: #c92a2a;
227
+ transform: scale(1.1);
153
228
  }
154
229
 
155
230
  .memori--remove-icon {
156
- width: 12px;
157
- height: 12px;
231
+ width: 12px;
232
+ height: 12px;
158
233
  }
159
234
 
160
235
  .memori--modal-preview-file {
161
- width: 100%;
162
- max-width: 800px;
163
- height: 100%;
164
- padding: 12px;
236
+ width: 100%;
237
+ max-width: 800px;
238
+ height: 100%;
239
+ padding: 12px;
165
240
  }
166
241
 
167
242
  .memori--preview-content {
168
- padding: 16px;
169
- border-radius: 8px;
170
- background-color: #f8f9fa;
171
- font-family: monospace;
172
- font-size: 14px;
173
- line-height: 1.5;
243
+ padding: 16px;
244
+ border-radius: 8px;
245
+ /* background-color: #f8f9fa; */
246
+ font-family: monospace;
247
+ font-size: 14px;
248
+ line-height: 1.5;
174
249
  }
175
250
 
176
251
  @keyframes fadeIn {
177
- from { opacity: 0; }
178
- to { opacity: 1; }
252
+ from {
253
+ opacity: 0;
254
+ }
255
+ to {
256
+ opacity: 1;
257
+ }
179
258
  }
180
259
 
181
260
  @keyframes scaleIn {
182
- from {
183
- opacity: 0;
184
- transform: scale(0.95);
185
- }
186
- to {
187
- opacity: 1;
188
- transform: scale(1);
189
- }
261
+ from {
262
+ opacity: 0;
263
+ transform: scale(0.95);
264
+ }
265
+ to {
266
+ opacity: 1;
267
+ transform: scale(1);
268
+ }
190
269
  }
191
270
 
192
271
  @keyframes slide-up {
193
- from {
194
- opacity: 0;
195
- transform: translateY(10px);
196
- }
197
- to {
198
- opacity: 1;
199
- transform: translateY(0);
200
- }
272
+ from {
273
+ opacity: 0;
274
+ transform: translateY(10px);
275
+ }
276
+ to {
277
+ opacity: 1;
278
+ transform: translateY(0);
279
+ }
201
280
  }
202
281
 
203
282
  @keyframes slide-in {
204
- from {
205
- opacity: 0;
206
- transform: translateY(-10px);
207
- }
208
- to {
209
- opacity: 1;
210
- transform: translateY(0);
211
- }
283
+ from {
284
+ opacity: 0;
285
+ transform: translateY(-10px);
286
+ }
287
+ to {
288
+ opacity: 1;
289
+ transform: translateY(0);
290
+ }
212
291
  }
213
292
 
214
293
  @keyframes slide-down {
215
- from {
216
- opacity: 1;
217
- transform: translateY(0);
218
- }
219
- to {
220
- opacity: 0;
221
- transform: translateY(10px);
222
- }
223
- }
294
+ from {
295
+ opacity: 1;
296
+ transform: translateY(0);
297
+ }
298
+ to {
299
+ opacity: 0;
300
+ transform: translateY(10px);
301
+ }
302
+ }
@@ -1,4 +1,4 @@
1
- import React, { useState } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import { PreviewIcon } from '../icons/Preview';
3
3
  import { DocumentIcon } from '../icons/Document';
4
4
  import { ImageIcon } from '../icons/Image';
@@ -11,22 +11,22 @@ type FilePreviewProps = {
11
11
  previewFiles: any;
12
12
  removeFile: (id: string, mediumID: string | undefined) => void;
13
13
  allowRemove?: boolean;
14
- isMessagePreview?: boolean;
14
+ // isMessagePreview?: boolean;
15
15
  };
16
16
 
17
17
  const FilePreview = ({
18
18
  previewFiles,
19
19
  removeFile,
20
20
  allowRemove = true,
21
- isMessagePreview = false,
22
- }: FilePreviewProps) => {
21
+ }: // isMessagePreview = false,
22
+ FilePreviewProps) => {
23
23
  const [selectedFile, setSelectedFile] = useState<{
24
24
  name: string;
25
25
  id: string;
26
26
  content: string;
27
27
  type?: string;
28
28
  } | null>(null);
29
-
29
+
30
30
  const [hoveredId, setHoveredId] = useState<string | null>(null);
31
31
 
32
32
  const getFileType = (filename: string, type?: string) => {
@@ -43,7 +43,7 @@ const FilePreview = ({
43
43
  return 'Image';
44
44
  }
45
45
  }
46
-
46
+
47
47
  // Otherwise use extension
48
48
  const extension = filename.split('.').pop()?.toLowerCase();
49
49
  switch (extension) {
@@ -67,37 +67,45 @@ const FilePreview = ({
67
67
  }
68
68
  };
69
69
 
70
+ useEffect(() => {
71
+ const chat = document.getElementsByClassName('memori-chat--content');
72
+ if (chat) {
73
+ const lastChild = chat[chat.length - 1];
74
+ if (lastChild) {
75
+ //then scroll to the bottom of the chat
76
+ (chat[0] as HTMLElement).scrollTo({
77
+ top: (chat[0] as HTMLElement).scrollHeight,
78
+ behavior: 'smooth',
79
+ });
80
+ }
81
+ }
82
+ }, [previewFiles]);
70
83
  // Detect if the content is an image URL
71
84
  const isImageContent = (content: string, type?: string): boolean => {
72
85
  if (type === 'image') return true;
73
-
86
+
74
87
  // Check if the content has image file extension or is an image URL
75
88
  const hasImageExtension = /\.(jpg|jpeg|png|gif|webp|svg)$/i.test(content);
76
- const isImageUrl = content.startsWith('http') &&
77
- (content.includes('/image/') ||
78
- content.includes('/img/') ||
79
- hasImageExtension);
80
-
89
+ const isImageUrl =
90
+ content.startsWith('http') &&
91
+ (content.includes('/image/') ||
92
+ content.includes('/img/') ||
93
+ hasImageExtension);
94
+
81
95
  return isImageUrl || hasImageExtension;
82
96
  };
83
97
 
84
98
  return (
85
99
  <>
86
100
  {previewFiles.length > 0 && (
87
- <div
88
- className={`memori--preview-container ${
89
- isMessagePreview
90
- ? 'memori--message-preview'
91
- : 'memori--absolute-preview'
92
- }`}
93
- >
101
+ <div className="memori--preview-container">
94
102
  <div className="memori--preview-list">
95
103
  {previewFiles.map((file: any) => (
96
104
  <div
97
105
  key={file.id}
98
106
  className={`memori--preview-item ${
99
- isImageContent(file.content, file.type)
100
- ? 'memori--preview-item--image'
107
+ isImageContent(file.content, file.type)
108
+ ? 'memori--preview-item--image'
101
109
  : 'memori--preview-item--document'
102
110
  }`}
103
111
  onMouseEnter={() => setHoveredId(file.id)}
@@ -111,14 +119,14 @@ const FilePreview = ({
111
119
  ) : (
112
120
  <DocumentIcon className="memori--preview-icon" />
113
121
  )}
114
-
122
+
115
123
  <div className="memori--preview-file-info">
116
124
  <span className="memori--preview-filename">{file.name}</span>
117
125
  <span className="memori--preview-filetype">
118
126
  {getFileType(file.name, file.type)}
119
127
  </span>
120
128
  </div>
121
-
129
+
122
130
  {allowRemove && (
123
131
  <Button
124
132
  shape="rounded"
@@ -138,7 +146,7 @@ const FilePreview = ({
138
146
  </div>
139
147
  </div>
140
148
  )}
141
-
149
+
142
150
  <Modal
143
151
  width="80%"
144
152
  widthMd="80%"
@@ -148,22 +156,27 @@ const FilePreview = ({
148
156
  closable
149
157
  title={selectedFile?.name}
150
158
  >
151
- <div
152
- className="memori--preview-content"
153
- style={{
154
- maxHeight: '70vh',
159
+ <div
160
+ className="memori--preview-content"
161
+ style={{
162
+ maxHeight: '70vh',
155
163
  overflowY: 'auto',
156
164
  textAlign: 'center',
157
- whiteSpace: selectedFile && !isImageContent(selectedFile.content, selectedFile.type) ? 'pre-wrap' : 'normal'
165
+ whiteSpace:
166
+ selectedFile &&
167
+ !isImageContent(selectedFile.content, selectedFile.type)
168
+ ? 'pre-wrap'
169
+ : 'normal',
158
170
  }}
159
171
  >
160
- {selectedFile && isImageContent(selectedFile.content, selectedFile.type) ? (
172
+ {selectedFile &&
173
+ isImageContent(selectedFile.content, selectedFile.type) ? (
161
174
  <>
162
- <img
163
- src={selectedFile.content}
164
- alt={selectedFile.name}
165
- style={{ maxWidth: '100%', maxHeight: '60vh' }}
166
- />
175
+ <img
176
+ src={selectedFile.content}
177
+ alt={selectedFile.name}
178
+ style={{ maxWidth: '100%', maxHeight: '60vh' }}
179
+ />
167
180
  </>
168
181
  ) : (
169
182
  stripHTML(selectedFile?.content || '')
@@ -174,4 +187,4 @@ const FilePreview = ({
174
187
  );
175
188
  };
176
189
 
177
- export default FilePreview;
190
+ export default FilePreview;
@@ -5,7 +5,7 @@ exports[`renders FilePreview unchanged 1`] = `<div />`;
5
5
  exports[`renders FilePreview with one file 1`] = `
6
6
  <div>
7
7
  <div
8
- class="memori--preview-container memori--absolute-preview"
8
+ class="memori--preview-container"
9
9
  >
10
10
  <div
11
11
  class="memori--preview-list"
@@ -100,7 +100,7 @@ exports[`renders FilePreview with one file 1`] = `
100
100
  exports[`renders FilePreview with two files 1`] = `
101
101
  <div>
102
102
  <div
103
- class="memori--preview-container memori--absolute-preview"
103
+ class="memori--preview-container"
104
104
  >
105
105
  <div
106
106
  class="memori--preview-list"
@@ -1,6 +1,6 @@
1
1
  .memori-header {
2
2
  position: relative;
3
- z-index: 999;
3
+ z-index: 1000;
4
4
  width: calc(50% - 1rem);
5
5
  height: 50px;
6
6
  padding: calc(var(--memori-inner-content-pad) / 4) calc(var(--memori-inner-content-pad) / 2);
@@ -106,4 +106,4 @@
106
106
 
107
107
  .memori-dropdown--avatar-initial:hover + .memori-dropdown--avatar-input,.memori-dropdown--avatar:hover + .memori-dropdown--avatar-input{
108
108
  display: block;
109
- }
109
+ }
@@ -69,6 +69,7 @@ export const RenderMediaItem = ({
69
69
  const isCodeSnippet = prismSyntaxLangs
70
70
  .map(l => l.mimeType)
71
71
  .includes(item.mimeType);
72
+ const isHTML = item.mimeType === 'text/html';
72
73
  const isImageRGB =
73
74
  item.url?.startsWith('rgb(') || item.url?.startsWith('rgba(');
74
75
 
@@ -199,7 +200,7 @@ export const RenderMediaItem = ({
199
200
  };
200
201
 
201
202
  // Handle code snippets with modal
202
- if (isCodeSnippet && item.content) {
203
+ if ((isCodeSnippet && item.content) || isHTML) {
203
204
  return (
204
205
  <>
205
206
  <a
@@ -129,7 +129,3 @@ button.memori-hints--show-more-button {
129
129
  background: #fff;
130
130
  color: #333;
131
131
  }
132
-
133
- .memori-media-widget {
134
- z-index: -1;
135
- }