@memori.ai/memori-react 7.25.1 → 7.26.1

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 (163) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/components/Chat/Chat.d.ts +5 -10
  3. package/dist/components/Chat/Chat.js +3 -3
  4. package/dist/components/Chat/Chat.js.map +1 -1
  5. package/dist/components/ChatBubble/ChatBubble.css +10 -0
  6. package/dist/components/ChatBubble/ChatBubble.d.ts +1 -0
  7. package/dist/components/ChatBubble/ChatBubble.js +24 -20
  8. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  9. package/dist/components/ChatBubble/VirtualizedContent/VirtualizedContent.d.ts +7 -0
  10. package/dist/components/ChatBubble/VirtualizedContent/VirtualizedContent.js +69 -0
  11. package/dist/components/ChatBubble/VirtualizedContent/VirtualizedContent.js.map +1 -0
  12. package/dist/components/ChatInputs/ChatInputs.d.ts +6 -10
  13. package/dist/components/ChatInputs/ChatInputs.js +37 -30
  14. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  15. package/dist/components/FilePreview/FilePreview.css +169 -140
  16. package/dist/components/FilePreview/FilePreview.d.ts +2 -6
  17. package/dist/components/FilePreview/FilePreview.js +58 -5
  18. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  19. package/dist/components/MediaWidget/LinkItemWidget.css +1 -0
  20. package/dist/components/MediaWidget/MediaItemWidget.css +10 -0
  21. package/dist/components/MediaWidget/MediaItemWidget.d.ts +6 -2
  22. package/dist/components/MediaWidget/MediaItemWidget.js +49 -11
  23. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  24. package/dist/components/MediaWidget/MediaWidget.d.ts +3 -1
  25. package/dist/components/MemoriWidget/MemoriWidget.d.ts +2 -1
  26. package/dist/components/MemoriWidget/MemoriWidget.js +10 -18
  27. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  28. package/dist/components/UploadButton/UploadButton.css +506 -27
  29. package/dist/components/UploadButton/UploadButton.d.ts +14 -11
  30. package/dist/components/UploadButton/UploadButton.js +121 -288
  31. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  32. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.d.ts +19 -0
  33. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +211 -0
  34. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -0
  35. package/dist/components/UploadButton/UploadImages/UploadImages.d.ts +13 -0
  36. package/dist/components/UploadButton/UploadImages/UploadImages.js +198 -0
  37. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -0
  38. package/dist/components/icons/Bug.d.ts +5 -0
  39. package/dist/components/icons/Bug.js +6 -0
  40. package/dist/components/icons/Bug.js.map +1 -0
  41. package/dist/components/icons/Document.d.ts +5 -0
  42. package/dist/components/icons/Document.js +10 -0
  43. package/dist/components/icons/Document.js.map +1 -0
  44. package/dist/components/icons/Image.d.ts +4 -0
  45. package/dist/components/icons/Image.js +9 -0
  46. package/dist/components/icons/Image.js.map +1 -0
  47. package/dist/components/icons/Preview.d.ts +4 -5
  48. package/dist/components/icons/Preview.js +5 -2
  49. package/dist/components/icons/Preview.js.map +1 -1
  50. package/dist/components/icons/Upload.d.ts +4 -5
  51. package/dist/components/icons/Upload.js +5 -2
  52. package/dist/components/icons/Upload.js.map +1 -1
  53. package/dist/components/layouts/HiddenChat.js +100 -10
  54. package/dist/components/layouts/HiddenChat.js.map +1 -1
  55. package/dist/components/layouts/hidden-chat.css +189 -119
  56. package/dist/components/ui/Card.d.ts +1 -0
  57. package/dist/components/ui/Card.js +2 -2
  58. package/dist/components/ui/Card.js.map +1 -1
  59. package/dist/locales/de.json +16 -0
  60. package/dist/locales/en.json +24 -0
  61. package/dist/locales/es.json +16 -0
  62. package/dist/locales/fr.json +16 -0
  63. package/dist/locales/it.json +22 -0
  64. package/esm/components/Chat/Chat.d.ts +5 -10
  65. package/esm/components/Chat/Chat.js +3 -3
  66. package/esm/components/Chat/Chat.js.map +1 -1
  67. package/esm/components/ChatBubble/ChatBubble.css +10 -0
  68. package/esm/components/ChatBubble/ChatBubble.d.ts +1 -0
  69. package/esm/components/ChatBubble/ChatBubble.js +24 -20
  70. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  71. package/esm/components/ChatBubble/VirtualizedContent/VirtualizedContent.d.ts +7 -0
  72. package/esm/components/ChatBubble/VirtualizedContent/VirtualizedContent.js +67 -0
  73. package/esm/components/ChatBubble/VirtualizedContent/VirtualizedContent.js.map +1 -0
  74. package/esm/components/ChatInputs/ChatInputs.d.ts +6 -10
  75. package/esm/components/ChatInputs/ChatInputs.js +37 -30
  76. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  77. package/esm/components/FilePreview/FilePreview.css +169 -140
  78. package/esm/components/FilePreview/FilePreview.d.ts +2 -6
  79. package/esm/components/FilePreview/FilePreview.js +58 -5
  80. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  81. package/esm/components/MediaWidget/LinkItemWidget.css +1 -0
  82. package/esm/components/MediaWidget/MediaItemWidget.css +10 -0
  83. package/esm/components/MediaWidget/MediaItemWidget.d.ts +6 -2
  84. package/esm/components/MediaWidget/MediaItemWidget.js +50 -12
  85. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  86. package/esm/components/MediaWidget/MediaWidget.d.ts +3 -1
  87. package/esm/components/MemoriWidget/MemoriWidget.d.ts +2 -1
  88. package/esm/components/MemoriWidget/MemoriWidget.js +10 -18
  89. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  90. package/esm/components/UploadButton/UploadButton.css +506 -27
  91. package/esm/components/UploadButton/UploadButton.d.ts +14 -11
  92. package/esm/components/UploadButton/UploadButton.js +122 -289
  93. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  94. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.d.ts +19 -0
  95. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +208 -0
  96. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -0
  97. package/esm/components/UploadButton/UploadImages/UploadImages.d.ts +13 -0
  98. package/esm/components/UploadButton/UploadImages/UploadImages.js +195 -0
  99. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -0
  100. package/esm/components/icons/Bug.d.ts +5 -0
  101. package/esm/components/icons/Bug.js +4 -0
  102. package/esm/components/icons/Bug.js.map +1 -0
  103. package/esm/components/icons/Document.d.ts +5 -0
  104. package/esm/components/icons/Document.js +6 -0
  105. package/esm/components/icons/Document.js.map +1 -0
  106. package/esm/components/icons/Image.d.ts +4 -0
  107. package/esm/components/icons/Image.js +5 -0
  108. package/esm/components/icons/Image.js.map +1 -0
  109. package/esm/components/icons/Preview.d.ts +4 -5
  110. package/esm/components/icons/Preview.js +4 -3
  111. package/esm/components/icons/Preview.js.map +1 -1
  112. package/esm/components/icons/Upload.d.ts +4 -5
  113. package/esm/components/icons/Upload.js +4 -3
  114. package/esm/components/icons/Upload.js.map +1 -1
  115. package/esm/components/layouts/HiddenChat.js +101 -11
  116. package/esm/components/layouts/HiddenChat.js.map +1 -1
  117. package/esm/components/layouts/hidden-chat.css +189 -119
  118. package/esm/components/ui/Card.d.ts +1 -0
  119. package/esm/components/ui/Card.js +2 -2
  120. package/esm/components/ui/Card.js.map +1 -1
  121. package/esm/locales/de.json +16 -0
  122. package/esm/locales/en.json +24 -0
  123. package/esm/locales/es.json +16 -0
  124. package/esm/locales/fr.json +16 -0
  125. package/esm/locales/it.json +22 -0
  126. package/package.json +1 -1
  127. package/src/components/Chat/Chat.stories.tsx +12 -0
  128. package/src/components/Chat/Chat.tsx +8 -8
  129. package/src/components/ChatBubble/ChatBubble.css +10 -0
  130. package/src/components/ChatBubble/ChatBubble.stories.tsx +203 -1
  131. package/src/components/ChatBubble/ChatBubble.tsx +49 -22
  132. package/src/components/ChatInputs/ChatInputs.tsx +92 -43
  133. package/src/components/FilePreview/FilePreview.css +169 -140
  134. package/src/components/FilePreview/FilePreview.tsx +106 -14
  135. package/src/components/FilePreview/__snapshots__/FilePreview.test.tsx.snap +146 -29
  136. package/src/components/MediaWidget/LinkItemWidget.css +1 -0
  137. package/src/components/MediaWidget/MediaItemWidget.css +10 -0
  138. package/src/components/MediaWidget/MediaItemWidget.tsx +136 -118
  139. package/src/components/MediaWidget/MediaWidget.test.tsx +2 -1
  140. package/src/components/MediaWidget/MediaWidget.tsx +1 -1
  141. package/src/components/MemoriWidget/MemoriWidget.tsx +7 -19
  142. package/src/components/UploadButton/UploadButton.css +506 -27
  143. package/src/components/UploadButton/UploadButton.stories.tsx +122 -20
  144. package/src/components/UploadButton/UploadButton.test.tsx +1 -1
  145. package/src/components/UploadButton/UploadButton.tsx +282 -451
  146. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +352 -0
  147. package/src/components/UploadButton/UploadImages/UploadImages.tsx +417 -0
  148. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +139 -13
  149. package/src/components/icons/Bug.tsx +81 -0
  150. package/src/components/icons/Document.tsx +50 -0
  151. package/src/components/icons/Image.tsx +37 -0
  152. package/src/components/icons/Preview.tsx +28 -22
  153. package/src/components/icons/Upload.tsx +33 -22
  154. package/src/components/layouts/HiddenChat.tsx +143 -7
  155. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +1 -1
  156. package/src/components/layouts/hidden-chat.css +189 -119
  157. package/src/components/ui/Card.tsx +3 -0
  158. package/src/index.stories.tsx +19 -19
  159. package/src/locales/de.json +16 -0
  160. package/src/locales/en.json +24 -0
  161. package/src/locales/es.json +16 -0
  162. package/src/locales/fr.json +16 -0
  163. package/src/locales/it.json +22 -0
@@ -1,5 +1,5 @@
1
1
  import React, { useState } from 'react';
2
- import { DialogState } from '@memori.ai/memori-api-client/dist/types';
2
+ import { DialogState, Medium } from '@memori.ai/memori-api-client/dist/types';
3
3
  import ChatTextArea from '../ChatTextArea/ChatTextArea';
4
4
  import Button from '../ui/Button';
5
5
  import { useTranslation } from 'react-i18next';
@@ -9,7 +9,7 @@ import cx from 'classnames';
9
9
  import Microphone from '../icons/Microphone';
10
10
  import UploadButton from '../UploadButton/UploadButton';
11
11
  import FilePreview from '../FilePreview/FilePreview';
12
-
12
+ import memoriApiClient from '@memori.ai/memori-api-client';
13
13
  export interface Props {
14
14
  dialogState?: DialogState;
15
15
  instruct?: boolean;
@@ -21,13 +21,7 @@ export interface Props {
21
21
  onChangeUserMessage: (userMessage: string) => void;
22
22
  sendMessage: (
23
23
  msg: string,
24
- media?: {
25
- mediumID: string;
26
- mimeType: string;
27
- content: string;
28
- title?: string;
29
- properties?: { [key: string]: any };
30
- }
24
+ media?: (Medium & { type: string })[]
31
25
  ) => void;
32
26
  onTextareaFocus: () => void;
33
27
  onTextareaBlur: () => void;
@@ -41,6 +35,8 @@ export interface Props {
41
35
  microphoneMode?: 'CONTINUOUS' | 'HOLD_TO_TALK';
42
36
  authToken?: string;
43
37
  showUpload?: boolean;
38
+ sessionID?: string;
39
+ apiURL?: string;
44
40
  }
45
41
 
46
42
  const ChatInputs: React.FC<Props> = ({
@@ -59,35 +55,60 @@ const ChatInputs: React.FC<Props> = ({
59
55
  startListening,
60
56
  stopListening,
61
57
  showUpload = false,
58
+ sessionID,
59
+ authToken,
60
+ apiURL,
62
61
  }) => {
63
62
  const { t } = useTranslation();
64
63
 
65
- // State for file preview list
66
- const [previewFiles, setPreviewFiles] = useState<
67
- { name: string; id: string; content: string }[]
64
+ // State for document preview files
65
+ const [documentPreviewFiles, setDocumentPreviewFiles] = useState<
66
+ {
67
+ name: string;
68
+ id: string;
69
+ content: string;
70
+ mediumID: string | undefined;
71
+ mimeType: string;
72
+ url?: string;
73
+ type: string;
74
+ }[]
68
75
  >([]);
69
76
 
77
+ // Client
78
+ const client = apiURL ? memoriApiClient(apiURL) : null;
79
+ const { dialog } = client || {
80
+ dialog: { postMediumDeselectedEvent: null },
81
+ };
82
+
70
83
  /**
71
84
  * Handles sending a message, including any attached files
72
85
  */
73
- const onSendMessage = () => {
86
+ const onSendMessage = (
87
+ files: {
88
+ name: string;
89
+ id: string;
90
+ content: string;
91
+ mediumID: string | undefined;
92
+ mimeType: string;
93
+ type: string;
94
+ url?: string;
95
+ }[]
96
+ ) => {
74
97
  sendMessage(
75
98
  userMessage,
76
- previewFiles[0]
77
- ? {
78
- mediumID: '',
79
- mimeType: 'text/plain',
80
- content: previewFiles[0].content,
81
- title: previewFiles[0].name,
82
- properties: {
83
- isAttachedFile: true,
84
- },
85
- }
86
- : undefined
99
+ files.map(file => ({
100
+ mediumID: file.mediumID || '',
101
+ mimeType: file.mimeType,
102
+ content: file.content,
103
+ title: file.name,
104
+ properties: { isAttachedFile: true },
105
+ type: file.type,
106
+ url: file.url,
107
+ }))
87
108
  );
88
109
 
89
110
  // Reset states after sending
90
- setPreviewFiles([]);
111
+ setDocumentPreviewFiles([]);
91
112
  stopAudio();
92
113
  speechSynthesis.speak(new SpeechSynthesisUtterance(''));
93
114
  };
@@ -100,20 +121,18 @@ const ChatInputs: React.FC<Props> = ({
100
121
  stopListening();
101
122
  sendMessage(
102
123
  userMessage,
103
- previewFiles[0]
104
- ? {
105
- mediumID: '',
106
- mimeType: 'text/plain',
107
- content: previewFiles[0].content,
108
- title: previewFiles[0].name,
109
- properties: {
110
- isAttachedFile: true,
111
- },
112
- }
113
- : undefined
124
+ documentPreviewFiles.map(file => ({
125
+ mediumID: file.mediumID || '',
126
+ mimeType: file.mimeType,
127
+ content: file.content,
128
+ title: file.name,
129
+ properties: { isAttachedFile: true },
130
+ type: file.type,
131
+ url: file.url,
132
+ }))
114
133
  );
115
134
 
116
- setPreviewFiles([]);
135
+ setDocumentPreviewFiles([]);
117
136
  onChangeUserMessage('');
118
137
  resetTranscript();
119
138
  }
@@ -122,9 +141,24 @@ const ChatInputs: React.FC<Props> = ({
122
141
  /**
123
142
  * Removes a file from the preview list
124
143
  */
125
- const removeFile = (fileId: string) => {
126
- setPreviewFiles((prev: { name: string; id: string; content: string }[]) =>
127
- prev.filter((file: { id: string }) => file.id !== fileId)
144
+ const removeFile = async (fileId: string, mediumID: string | undefined) => {
145
+ console.log('removeFile', fileId);
146
+ // Call the MediumDeselected event if dialog API is available
147
+ if (dialog.postMediumDeselectedEvent && sessionID && mediumID) {
148
+ await dialog.postMediumDeselectedEvent(sessionID, mediumID);
149
+ }
150
+ setDocumentPreviewFiles(
151
+ (
152
+ prev: {
153
+ name: string;
154
+ id: string;
155
+ content: string;
156
+ mediumID: string | undefined;
157
+ mimeType: string;
158
+ type: string;
159
+ url?: string;
160
+ }[]
161
+ ) => prev.filter((file: { id: string }) => file.id !== fileId)
128
162
  );
129
163
  };
130
164
 
@@ -144,10 +178,23 @@ const ChatInputs: React.FC<Props> = ({
144
178
  dialogState?.state || ''
145
179
  )}
146
180
  />
181
+ {/* Preview for document files */}
147
182
  {showUpload && (
148
183
  <>
149
- <FilePreview previewFiles={previewFiles} removeFile={removeFile} />
150
- <UploadButton setPreviewFiles={setPreviewFiles} />
184
+ <FilePreview
185
+ previewFiles={documentPreviewFiles}
186
+ removeFile={removeFile}
187
+ />
188
+
189
+ {/* Replace the individual buttons with our unified upload component */}
190
+ <UploadButton
191
+ authToken={authToken}
192
+ apiUrl={apiURL}
193
+ sessionID={sessionID}
194
+ isMediaAccepted={dialogState?.acceptsMedia || false}
195
+ setDocumentPreviewFiles={setDocumentPreviewFiles}
196
+ documentPreviewFiles={documentPreviewFiles}
197
+ />
151
198
  </>
152
199
  )}
153
200
  <Button
@@ -155,7 +202,9 @@ const ChatInputs: React.FC<Props> = ({
155
202
  primary={!!userMessage?.length}
156
203
  disabled={!userMessage || userMessage.length === 0}
157
204
  className="memori-chat-inputs--send"
158
- onClick={onSendMessage}
205
+ onClick={() => {
206
+ onSendMessage(documentPreviewFiles);
207
+ }}
159
208
  title={t('send') || 'Send'}
160
209
  icon={<Send />}
161
210
  />
@@ -1,155 +1,184 @@
1
- .memori--preview-container {
2
- min-width: 200px;
3
- padding: 12px;
4
- border-radius: 8px;
5
- margin-bottom: 12px;
6
- animation: slide-in 0.3s ease;
7
- background: white;
8
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
9
- transition: all 0.3s ease;
10
- }
1
+ /* Updated FilePreview Styles */
11
2
 
12
- .memori--preview-container.slide-down {
13
- animation: slide-down 0.3s ease;
14
- }
15
-
16
- .memori--absolute-preview {
17
- position: absolute;
18
- right: 0;
19
- bottom: 100%;
20
- left: 0;
21
- }
22
-
23
- .memori--message-preview {
24
- margin: 12px 0;
25
- }
26
-
27
- .memori--preview-list {
28
- display: flex;
29
- flex-direction: column;
30
- gap: 8px;
31
- }
32
-
33
- .memori--preview-item {
34
- position: relative;
35
- display: flex;
36
- max-width: fit-content;
37
- align-items: center;
38
- padding: 8px;
39
- border-radius: 8px;
40
- animation: slide-in 0.3s ease;
41
- background-color: #f8f9fa;
42
- cursor: pointer;
43
- gap: 8px;
44
- transition: all 0.2s ease;
45
- }
46
-
47
- .memori--preview-item:hover {
48
- background-color: #f1f3f5;
49
- transform: translateX(4px);
50
- }
51
-
52
- .memori--preview-icon {
53
- width: 20px;
54
- height: 20px;
55
- flex-shrink: 0;
56
- fill: var(--memori-primary);
57
- }
58
-
59
- .memori--preview-filename {
60
- overflow: hidden;
61
- max-width: 200px;
62
- color: #495057;
63
- font-size: 14px;
64
- text-overflow: ellipsis;
65
- white-space: nowrap;
66
- }
67
-
68
- .memori--modal-title-preview {
69
- margin-top: 12px;
70
- margin-bottom: 12px;
71
- font-size: 20px;
72
- font-weight: 600;
73
- }
74
-
75
- .memori--remove-button {
76
- position: absolute;
77
- top: -4px;
78
- right: -4px;
79
- padding: 4px;
80
- border: none;
81
- border-radius: 50%;
82
- background-color: #e03131;
83
- color: white;
84
- cursor: pointer;
3
+ .memori--preview-container {
4
+ min-width: 100%;
5
+ padding: 12px;
6
+ border-radius: 8px;
7
+ margin-bottom: 12px;
8
+ animation: slide-in 0.3s ease;
9
+ background: white;
10
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
11
+ transition: all 0.3s ease;
12
+ }
13
+
14
+ .memori--preview-container.slide-down {
15
+ animation: slide-down 0.3s ease;
16
+ }
17
+
18
+ .memori--absolute-preview {
19
+ position: absolute;
20
+ bottom: 100%;
21
+ }
22
+
23
+ .memori--message-preview {
24
+ max-width: 100%;
25
+ margin: 12px 0;
26
+ }
27
+
28
+ .memori--preview-list {
29
+ display: flex;
30
+ flex-direction: row;
31
+ gap: 8px;
32
+ overflow-x: auto;
33
+ }
34
+
35
+ .memori--preview-item {
36
+ position: relative;
37
+ display: flex;
38
+ max-width: fit-content;
39
+ align-items: center;
40
+ padding: 8px;
41
+ border-radius: 8px;
42
+ animation: slide-in 0.3s ease;
43
+ background-color: #f8f9fa;
44
+ cursor: pointer;
45
+ gap: 8px;
46
+ transition: all 0.2s ease;
47
+ }
48
+
49
+ .memori--preview-item:hover {
50
+ background-color: #f1f3f5;
51
+ transform: translateX(4px);
52
+ }
53
+
54
+ .memori--preview-icon {
55
+ width: 20px;
56
+ height: 20px;
57
+ flex-shrink: 0;
58
+ color: #fff;
59
+ fill: var(--memori-primary);
60
+ }
61
+
62
+ .memori--preview-file-info {
63
+ display: flex;
64
+ overflow: hidden;
65
+ flex-direction: column;
66
+ }
67
+
68
+ .memori--preview-filename {
69
+ overflow: hidden;
70
+ max-width: 200px;
71
+ color: #495057;
72
+ font-size: 14px;
73
+ font-weight: 500;
74
+ text-overflow: ellipsis;
75
+ white-space: nowrap;
76
+ }
77
+
78
+ .memori--preview-filetype {
79
+ margin-top: 2px;
80
+ color: #868e96;
81
+ font-size: 12px;
82
+ }
83
+
84
+ .memori--modal-title-preview {
85
+ margin-top: 12px;
86
+ margin-bottom: 12px;
87
+ font-size: 20px;
88
+ font-weight: 600;
89
+ }
90
+
91
+ .memori--remove-button {
92
+ position: absolute;
93
+ top: -4px;
94
+ right: -4px;
95
+ padding: 4px;
96
+ border: none;
97
+ border-radius: 50%;
98
+ background-color: #e03131;
99
+ color: white;
100
+ cursor: pointer;
101
+ opacity: 0;
102
+ transform: scale(0.75);
103
+ transition: all 0.2s ease;
104
+ }
105
+
106
+ .memori--remove-button.visible {
107
+ opacity: 1;
108
+ transform: scale(1);
109
+ }
110
+
111
+ .memori--remove-button:hover {
112
+ background-color: #c92a2a;
113
+ transform: scale(1.1);
114
+ }
115
+
116
+ .memori--remove-icon {
117
+ width: 12px;
118
+ height: 12px;
119
+ }
120
+
121
+ .memori--modal-preview-file {
122
+ width: 100%;
123
+ max-width: 800px;
124
+ height: 100%;
125
+ padding: 12px;
126
+ }
127
+
128
+ .memori--preview-content {
129
+ padding: 16px;
130
+ border-radius: 8px;
131
+ background-color: #f8f9fa;
132
+ font-family: monospace;
133
+ font-size: 14px;
134
+ line-height: 1.5;
135
+ }
136
+
137
+ @keyframes fadeIn {
138
+ from { opacity: 0; }
139
+ to { opacity: 1; }
140
+ }
141
+
142
+ @keyframes scaleIn {
143
+ from {
85
144
  opacity: 0;
86
- transform: scale(0.75);
87
- transition: all 0.2s ease;
145
+ transform: scale(0.95);
88
146
  }
89
-
90
- .memori--remove-button.visible {
147
+ to {
91
148
  opacity: 1;
92
149
  transform: scale(1);
93
150
  }
151
+ }
94
152
 
95
- .memori--remove-button:hover {
96
- background-color: #c92a2a;
97
- transform: scale(1.1);
98
- }
99
-
100
- .memori--remove-icon {
101
- width: 12px;
102
- height: 12px;
153
+ @keyframes slide-up {
154
+ from {
155
+ opacity: 0;
156
+ transform: translateY(10px);
103
157
  }
104
-
105
- .memori--modal-preview-file {
106
- width: 100%;
107
- max-width: 800px;
108
- height: 100%;
109
- padding: 12px;
158
+ to {
159
+ opacity: 1;
160
+ transform: translateY(0);
110
161
  }
162
+ }
111
163
 
112
- @keyframes fadeIn {
113
- from { opacity: 0; }
114
- to { opacity: 1; }
164
+ @keyframes slide-in {
165
+ from {
166
+ opacity: 0;
167
+ transform: translateY(-10px);
115
168
  }
116
-
117
- @keyframes scaleIn {
118
- from {
119
- opacity: 0;
120
- transform: scale(0.95);
121
- }
122
- to {
123
- opacity: 1;
124
- transform: scale(1);
125
- }
169
+ to {
170
+ opacity: 1;
171
+ transform: translateY(0);
126
172
  }
173
+ }
127
174
 
128
- @keyframes slide-up {
129
- from {
130
- opacity: 0;
131
- transform: translateY(10px);
132
- }
133
- to {
134
- opacity: 1;
135
- transform: translateY(0);
136
- }
175
+ @keyframes slide-down {
176
+ from {
177
+ opacity: 1;
178
+ transform: translateY(0);
137
179
  }
138
-
139
- @keyframes slide-in {
140
- from {
141
- opacity: 0;
142
- transform: translateY(-10px);
143
- }
144
- to {
145
- opacity: 1;
146
- transform: translateY(0);
147
- }
180
+ to {
181
+ opacity: 0;
182
+ transform: translateY(10px);
148
183
  }
149
-
150
- @keyframes slide-down {
151
- from {
152
- opacity: 1;
153
- transform: translateY(0);
154
- }
155
- }
184
+ }