reachat 2.0.1 → 2.1.0-alpha.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.
- package/dist/{CSVFileRenderer-Dy3iLTeu.js → CSVFileRenderer-BAbkFZ2w.js} +2 -2
- package/dist/{CSVFileRenderer-Dy3iLTeu.js.map → CSVFileRenderer-BAbkFZ2w.js.map} +1 -1
- package/dist/{DefaultFileRenderer-Dxar9MFe.js → DefaultFileRenderer-Bgc4Jadg.js} +2 -2
- package/dist/{DefaultFileRenderer-Dxar9MFe.js.map → DefaultFileRenderer-Bgc4Jadg.js.map} +1 -1
- package/dist/ImageFileRenderer-C8tVW3I8.js.map +1 -1
- package/dist/PDFFileRenderer-DQdFS2l6.js.map +1 -1
- package/dist/docs.json +6 -2
- package/dist/{index-NuRjkHCl.js → index-unCEyRCC.js} +12 -12
- package/dist/index-unCEyRCC.js.map +1 -0
- package/dist/index.css +2495 -673
- package/dist/index.js +2 -2
- package/dist/index.umd.cjs +9 -9
- package/dist/index.umd.cjs.map +1 -1
- package/dist/stories/Changelog.mdx +8 -0
- package/dist/stories/Chat.stories.tsx +265 -0
- package/dist/stories/ChatBubble.stories.tsx +267 -0
- package/dist/stories/Companion.stories.tsx +435 -0
- package/dist/stories/Console.stories.tsx +1154 -0
- package/dist/stories/Integration.stories.tsx +312 -0
- package/dist/stories/Intro.mdx +41 -0
- package/dist/stories/Support.mdx +9 -0
- package/dist/stories/assets/chat-voice-fill.svg +5 -0
- package/dist/stories/assets/close-fill.svg +5 -0
- package/dist/stories/assets/logo.svg +21 -0
- package/dist/stories/assets/menu.svg +1 -0
- package/dist/stories/assets/paperclip.svg +1 -0
- package/dist/stories/assets/placeholder-dark.svg +500 -0
- package/dist/stories/assets/placeholder.svg +258 -0
- package/dist/stories/assets/search.svg +1 -0
- package/dist/stories/examples.ts +267 -0
- package/package.json +8 -4
- package/dist/index-NuRjkHCl.js.map +0 -1
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { useState, useCallback, useRef, useEffect } from 'react';
|
|
2
|
+
import OpenAI from 'openai';
|
|
3
|
+
import { Meta } from '@storybook/react';
|
|
4
|
+
import {
|
|
5
|
+
Chat,
|
|
6
|
+
Session,
|
|
7
|
+
SessionsList,
|
|
8
|
+
NewSessionButton,
|
|
9
|
+
SessionMessages,
|
|
10
|
+
SessionGroups,
|
|
11
|
+
ChatInput,
|
|
12
|
+
SessionMessagePanel,
|
|
13
|
+
SessionMessagesHeader
|
|
14
|
+
} from 'reachat';
|
|
15
|
+
import { Input } from 'reablocks';
|
|
16
|
+
import { generateText } from 'ai';
|
|
17
|
+
import { createOpenAI } from '@ai-sdk/openai';
|
|
18
|
+
|
|
19
|
+
export default {
|
|
20
|
+
title: 'Demos/Integrations',
|
|
21
|
+
component: Chat
|
|
22
|
+
} as Meta;
|
|
23
|
+
|
|
24
|
+
export const _OpenAI = () => {
|
|
25
|
+
const [sessions, setSessions] = useState<Session[]>([]);
|
|
26
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
27
|
+
const [activeSessionId, setActiveSessionId] = useState(null);
|
|
28
|
+
const [apiKey, setApiKey] = useState('');
|
|
29
|
+
|
|
30
|
+
const openai = useRef<OpenAI | null>(null);
|
|
31
|
+
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (apiKey) {
|
|
34
|
+
openai.current = new OpenAI({
|
|
35
|
+
apiKey: apiKey,
|
|
36
|
+
dangerouslyAllowBrowser: true // For demo purposes only
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}, [apiKey]);
|
|
40
|
+
|
|
41
|
+
const handleNewMessage = useCallback(
|
|
42
|
+
async (message: string, sessionId: string = '1') => {
|
|
43
|
+
setIsLoading(true);
|
|
44
|
+
try {
|
|
45
|
+
const response = await openai.current.chat.completions.create({
|
|
46
|
+
model: 'gpt-3.5-turbo',
|
|
47
|
+
messages: [{ role: 'user', content: message }]
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const aiResponse =
|
|
51
|
+
response.choices[0]?.message?.content ||
|
|
52
|
+
'Sorry, I couldnt generate a response.';
|
|
53
|
+
|
|
54
|
+
setSessions(prevSessions => {
|
|
55
|
+
const sessionIndex = prevSessions.findIndex(s => s.id === sessionId);
|
|
56
|
+
if (sessionIndex === -1) {
|
|
57
|
+
// Create a new session
|
|
58
|
+
return [
|
|
59
|
+
...prevSessions,
|
|
60
|
+
{
|
|
61
|
+
id: sessionId,
|
|
62
|
+
title: message.slice(0, 30),
|
|
63
|
+
createdAt: new Date(),
|
|
64
|
+
updatedAt: new Date(),
|
|
65
|
+
conversations: [
|
|
66
|
+
{
|
|
67
|
+
id: Date.now().toString(),
|
|
68
|
+
question: message,
|
|
69
|
+
response: aiResponse,
|
|
70
|
+
createdAt: new Date(),
|
|
71
|
+
updatedAt: new Date()
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
];
|
|
76
|
+
} else {
|
|
77
|
+
// Add to existing session
|
|
78
|
+
const updatedSessions = [...prevSessions];
|
|
79
|
+
updatedSessions[sessionIndex] = {
|
|
80
|
+
...updatedSessions[sessionIndex],
|
|
81
|
+
updatedAt: new Date(),
|
|
82
|
+
conversations: [
|
|
83
|
+
...updatedSessions[sessionIndex].conversations,
|
|
84
|
+
{
|
|
85
|
+
id: Date.now().toString(),
|
|
86
|
+
question: message,
|
|
87
|
+
response: aiResponse,
|
|
88
|
+
createdAt: new Date(),
|
|
89
|
+
updatedAt: new Date()
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
};
|
|
93
|
+
return updatedSessions;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
setActiveSessionId(sessionId);
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.error('Error calling OpenAI API:', error);
|
|
100
|
+
} finally {
|
|
101
|
+
setIsLoading(false);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
[openai]
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
const handleDeleteSession = useCallback((sessionId: string) => {
|
|
108
|
+
setSessions(prevSessions => prevSessions.filter(s => s.id !== sessionId));
|
|
109
|
+
}, []);
|
|
110
|
+
|
|
111
|
+
return (
|
|
112
|
+
<div
|
|
113
|
+
style={{
|
|
114
|
+
position: 'absolute',
|
|
115
|
+
top: 0,
|
|
116
|
+
left: 0,
|
|
117
|
+
right: 0,
|
|
118
|
+
bottom: 0,
|
|
119
|
+
padding: 20
|
|
120
|
+
}}
|
|
121
|
+
>
|
|
122
|
+
<Input
|
|
123
|
+
fullWidth
|
|
124
|
+
placeholder="OpenAI API Key"
|
|
125
|
+
value={apiKey}
|
|
126
|
+
onChange={e => setApiKey(e.target.value)}
|
|
127
|
+
/>
|
|
128
|
+
<div
|
|
129
|
+
className="dark:bg-gray-950 bg-white"
|
|
130
|
+
style={{
|
|
131
|
+
position: 'absolute',
|
|
132
|
+
top: 50,
|
|
133
|
+
left: 0,
|
|
134
|
+
right: 0,
|
|
135
|
+
bottom: 0,
|
|
136
|
+
padding: 20,
|
|
137
|
+
margin: 20,
|
|
138
|
+
borderRadius: 5
|
|
139
|
+
}}
|
|
140
|
+
>
|
|
141
|
+
<Chat
|
|
142
|
+
viewType="console"
|
|
143
|
+
sessions={sessions}
|
|
144
|
+
isLoading={isLoading}
|
|
145
|
+
disabled={!apiKey}
|
|
146
|
+
onDeleteSession={handleDeleteSession}
|
|
147
|
+
onSendMessage={handleNewMessage}
|
|
148
|
+
activeSessionId={activeSessionId}
|
|
149
|
+
>
|
|
150
|
+
<SessionsList>
|
|
151
|
+
<NewSessionButton />
|
|
152
|
+
<SessionGroups />
|
|
153
|
+
</SessionsList>
|
|
154
|
+
|
|
155
|
+
<SessionMessagePanel>
|
|
156
|
+
<SessionMessagesHeader />
|
|
157
|
+
<SessionMessages />
|
|
158
|
+
<ChatInput />
|
|
159
|
+
</SessionMessagePanel>
|
|
160
|
+
</Chat>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
);
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
export const VercelAI = () => {
|
|
167
|
+
const [sessions, setSessions] = useState<Session[]>([]);
|
|
168
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
169
|
+
const [activeSessionId, setActiveSessionId] = useState<string | null>(null);
|
|
170
|
+
const [apiKey, setApiKey] = useState('');
|
|
171
|
+
|
|
172
|
+
const handleNewMessage = useCallback(
|
|
173
|
+
async (message: string, sessionId: string | null = null) => {
|
|
174
|
+
if (!apiKey) {
|
|
175
|
+
console.error('API key not set');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
setIsLoading(true);
|
|
180
|
+
try {
|
|
181
|
+
const openai = createOpenAI({ apiKey });
|
|
182
|
+
const req = await generateText({
|
|
183
|
+
model: openai('gpt-3.5-turbo'),
|
|
184
|
+
prompt: message
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const response = req.text;
|
|
188
|
+
|
|
189
|
+
setSessions(prevSessions => {
|
|
190
|
+
const newSessionId = sessionId || Date.now().toString();
|
|
191
|
+
const sessionIndex = prevSessions.findIndex(
|
|
192
|
+
s => s.id === newSessionId
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
if (sessionIndex === -1) {
|
|
196
|
+
// Create a new session
|
|
197
|
+
const newSession: Session = {
|
|
198
|
+
id: newSessionId,
|
|
199
|
+
title: message.slice(0, 30),
|
|
200
|
+
createdAt: new Date(),
|
|
201
|
+
updatedAt: new Date(),
|
|
202
|
+
conversations: [
|
|
203
|
+
{
|
|
204
|
+
id: Date.now().toString(),
|
|
205
|
+
question: message,
|
|
206
|
+
response: response,
|
|
207
|
+
createdAt: new Date(),
|
|
208
|
+
updatedAt: new Date()
|
|
209
|
+
}
|
|
210
|
+
]
|
|
211
|
+
};
|
|
212
|
+
return [...prevSessions, newSession];
|
|
213
|
+
} else {
|
|
214
|
+
// Add to existing session
|
|
215
|
+
const updatedSessions = [...prevSessions];
|
|
216
|
+
updatedSessions[sessionIndex] = {
|
|
217
|
+
...updatedSessions[sessionIndex],
|
|
218
|
+
updatedAt: new Date(),
|
|
219
|
+
conversations: [
|
|
220
|
+
...updatedSessions[sessionIndex].conversations,
|
|
221
|
+
{
|
|
222
|
+
id: Date.now().toString(),
|
|
223
|
+
question: message,
|
|
224
|
+
response: response,
|
|
225
|
+
createdAt: new Date(),
|
|
226
|
+
updatedAt: new Date()
|
|
227
|
+
}
|
|
228
|
+
]
|
|
229
|
+
};
|
|
230
|
+
return updatedSessions;
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
setActiveSessionId(sessionId || Date.now().toString());
|
|
235
|
+
} catch (error) {
|
|
236
|
+
console.error('Error generating text:', error);
|
|
237
|
+
} finally {
|
|
238
|
+
setIsLoading(false);
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
[apiKey]
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
const handleDeleteSession = useCallback(
|
|
245
|
+
(sessionId: string) => {
|
|
246
|
+
setSessions(prevSessions => prevSessions.filter(s => s.id !== sessionId));
|
|
247
|
+
if (activeSessionId === sessionId) {
|
|
248
|
+
setActiveSessionId(null);
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
[activeSessionId]
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
const handleNewSession = useCallback(() => {
|
|
255
|
+
setActiveSessionId(null);
|
|
256
|
+
}, []);
|
|
257
|
+
|
|
258
|
+
return (
|
|
259
|
+
<div
|
|
260
|
+
style={{
|
|
261
|
+
position: 'absolute',
|
|
262
|
+
top: 0,
|
|
263
|
+
left: 0,
|
|
264
|
+
right: 0,
|
|
265
|
+
bottom: 0,
|
|
266
|
+
padding: 20
|
|
267
|
+
}}
|
|
268
|
+
>
|
|
269
|
+
<Input
|
|
270
|
+
fullWidth
|
|
271
|
+
placeholder="OpenAI API Key"
|
|
272
|
+
value={apiKey}
|
|
273
|
+
onChange={e => setApiKey(e.target.value)}
|
|
274
|
+
/>
|
|
275
|
+
<div
|
|
276
|
+
className="dark:bg-gray-950 bg-white"
|
|
277
|
+
style={{
|
|
278
|
+
position: 'absolute',
|
|
279
|
+
top: 50,
|
|
280
|
+
left: 0,
|
|
281
|
+
right: 0,
|
|
282
|
+
bottom: 0,
|
|
283
|
+
padding: 20,
|
|
284
|
+
margin: 20,
|
|
285
|
+
borderRadius: 5
|
|
286
|
+
}}
|
|
287
|
+
>
|
|
288
|
+
<Chat
|
|
289
|
+
viewType="console"
|
|
290
|
+
sessions={sessions}
|
|
291
|
+
isLoading={isLoading}
|
|
292
|
+
disabled={!apiKey}
|
|
293
|
+
onSendMessage={handleNewMessage}
|
|
294
|
+
onDeleteSession={handleDeleteSession}
|
|
295
|
+
activeSessionId={activeSessionId}
|
|
296
|
+
onSelectSession={setActiveSessionId}
|
|
297
|
+
>
|
|
298
|
+
<SessionsList>
|
|
299
|
+
<NewSessionButton />
|
|
300
|
+
<SessionGroups />
|
|
301
|
+
</SessionsList>
|
|
302
|
+
|
|
303
|
+
<SessionMessagePanel>
|
|
304
|
+
<SessionMessagesHeader />
|
|
305
|
+
<SessionMessages />
|
|
306
|
+
<ChatInput />
|
|
307
|
+
</SessionMessagePanel>
|
|
308
|
+
</Chat>
|
|
309
|
+
</div>
|
|
310
|
+
</div>
|
|
311
|
+
);
|
|
312
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs';
|
|
2
|
+
|
|
3
|
+
<Meta title="Docs/Intro" />
|
|
4
|
+
|
|
5
|
+
<div style={{ margin: '0 auto', maxWidth: '600px', color: 'white', textAlign: 'center', display: 'flex', flexDirection: 'column' }}>
|
|
6
|
+
<img
|
|
7
|
+
style={{ width: '75%', margin: '0 auto 2em auto' }}
|
|
8
|
+
src="https://raw.githubusercontent.com/reaviz/reachat/refs/heads/master/src/assets/logo/logo.png"
|
|
9
|
+
/>
|
|
10
|
+
<br />
|
|
11
|
+
<div style={{ display: 'flex' }}>
|
|
12
|
+
<a href="https://github.com/reaviz/reachat/actions/workflows/build.yml" target="_blank">
|
|
13
|
+
<img src="https://github.com/reaviz/reachat/actions/workflows/build.yml/badge.svg" />
|
|
14
|
+
</a>
|
|
15
|
+
<span> </span>
|
|
16
|
+
<a href="https://npm.im/reachat" target="_blank">
|
|
17
|
+
<img src="https://img.shields.io/npm/v/reachat.svg" />
|
|
18
|
+
</a>
|
|
19
|
+
<span> </span>
|
|
20
|
+
<a href="https://npm.im/reachat" target="_blank">
|
|
21
|
+
<img src="https://badgen.net/npm/dw/reachat" />
|
|
22
|
+
</a>
|
|
23
|
+
<span> </span>
|
|
24
|
+
<a href="https://github.com/reaviz/reachat/blob/master/LICENSE" target="_blank">
|
|
25
|
+
<img src="https://badgen.now.sh/badge/license/apache2" />
|
|
26
|
+
</a>
|
|
27
|
+
<span> </span>
|
|
28
|
+
<a href="https://github.com/reaviz/reachat" target="_blank">
|
|
29
|
+
<img alt="GitHub stars" src="https://img.shields.io/github/stars/reaviz/reachat?style=social" />
|
|
30
|
+
</a>
|
|
31
|
+
<span> </span>
|
|
32
|
+
<a href="https://discord.gg/tt8wGExq35" target="_blank">
|
|
33
|
+
<img src="https://img.shields.io/discord/773948315037073409?label=discord" />
|
|
34
|
+
</a>
|
|
35
|
+
</div>
|
|
36
|
+
<br />
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
reachat is a set o building blocks for LLM UIs
|
|
41
|
+
</div>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks';
|
|
2
|
+
|
|
3
|
+
<Meta title="Docs/Support" />
|
|
4
|
+
|
|
5
|
+
# Support
|
|
6
|
+
|
|
7
|
+
We encourage users to make PRs and [log tickets](https://github.com/reaviz/reachat/issues) for issues. We will try to respond to them as quickly as possible
|
|
8
|
+
but if you are in need of extra support, our team at [Good Code](https://goodcode.us?utm=reachat) is here to help. Reach out
|
|
9
|
+
to us today to discuss our packages and support plans.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<g id="chat-voice-fill">
|
|
3
|
+
<path id="Vector" d="M3.28596 12.714C2.07954 11.5076 1.33334 9.84091 1.33334 7.99998C1.33334 4.31808 4.31811 1.33331 8.00001 1.33331C11.6819 1.33331 14.6667 4.31808 14.6667 7.99998C14.6667 11.6818 11.6819 14.6666 8.00001 14.6666H1.33334L3.28596 12.714ZM7.33334 3.99998V12H8.66668V3.99998H7.33334ZM4.66668 5.99998V9.99998H6.00001V5.99998H4.66668ZM10 5.99998V9.99998H11.3333V5.99998H10Z" fill="currentColor"/>
|
|
4
|
+
</g>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<g id="close-fill">
|
|
3
|
+
<path id="Vector" d="M9.99975 8.82208L14.1246 4.69727L15.3031 5.87577L11.1782 10.0006L15.3031 14.1253L14.1246 15.3038L9.99975 11.1791L5.87497 15.3038L4.69645 14.1253L8.82125 10.0006L4.69645 5.87577L5.87497 4.69727L9.99975 8.82208Z" fill="#EEEEF0"/>
|
|
4
|
+
</g>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<svg width="795" height="140" viewBox="0 0 795 140" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M18.3191 17.5C10.2662 17.5 3.73579 24.0304 3.73579 32.0833V102.083L30.2775 84.5833H82.4858C90.5387 84.5833 97.0691 78.0529 97.0691 70V17.5H18.3191Z" fill="url(#paint0_linear_182_647)"/>
|
|
3
|
+
<path d="M137.902 61.2501V134.167L111.361 116.667H59.1525C51.0995 116.667 44.5691 110.136 44.5691 102.083V84.5834H82.4858C90.5387 84.5834 97.0691 78.053 97.0691 70.0001V46.6667H123.319C131.372 46.6667 137.902 53.1972 137.902 61.2501Z" fill="url(#paint1_linear_182_647)"/>
|
|
4
|
+
<path d="M251.987 103.6H237.683L224.147 80.2719H214.067V103.6H200.819V36.3999H227.699C233.939 36.3999 239.219 38.6079 243.539 42.9279C247.859 47.2479 250.067 52.5279 250.067 58.6719C250.067 67.0239 244.883 74.7039 237.107 78.2559L251.987 103.6ZM227.699 48.7839H200.819V68.6559H227.699C232.691 68.6559 236.819 64.1439 236.819 58.6719C236.819 53.1999 232.691 48.7839 227.699 48.7839Z" fill="white"/>
|
|
5
|
+
<path d="M290.508 75.8559V90.9279H332.076V103.6H290.508V36.3999H331.596V49.0719H290.508V63.3759H329.196V75.8559H290.508Z" fill="white"/>
|
|
6
|
+
<path d="M430.765 103.6H416.365L412.333 91.5039H385.549L381.517 103.6H367.213L390.733 36.3999H407.149L430.765 103.6ZM398.989 51.6639L385.549 91.5039H412.333L398.989 51.6639Z" fill="white"/>
|
|
7
|
+
<path d="M497.445 104.944C487.365 104.944 479.013 101.584 472.389 94.8639C465.765 88.1439 462.501 79.8879 462.501 69.9999C462.501 60.1119 465.765 51.7599 472.389 45.1359C479.013 38.4159 487.365 35.0559 497.445 35.0559C509.637 35.0559 520.581 41.1999 526.341 50.8959L514.917 57.5199C511.557 51.4719 505.125 47.9199 497.445 47.9199C490.917 47.9199 485.637 49.9359 481.605 54.0639C477.669 58.1919 475.653 63.4719 475.653 69.9999C475.653 76.4319 477.669 81.7119 481.605 85.8399C485.637 89.9679 490.917 91.9839 497.445 91.9839C505.125 91.9839 511.749 88.3359 514.917 82.4799L526.341 89.1039C520.581 98.7999 509.733 104.944 497.445 104.944Z" fill="white"/>
|
|
8
|
+
<path d="M603.407 63.0879V36.3999H616.559V103.6H603.407V75.7599H578.447V103.6H565.199V36.3999H578.447V63.0879H603.407Z" fill="white"/>
|
|
9
|
+
<path d="M717.363 103.6H702.963L698.931 91.5039H672.147L668.115 103.6H653.811L677.331 36.3999H693.747L717.363 103.6ZM685.587 51.6639L672.147 91.5039H698.931L685.587 51.6639Z" fill="white"/>
|
|
10
|
+
<path d="M744.741 36.3999H794.181V49.0719H776.037V103.6H762.789V49.0719H744.741V36.3999Z" fill="white"/>
|
|
11
|
+
<defs>
|
|
12
|
+
<linearGradient id="paint0_linear_182_647" x1="50.4025" y1="17.5" x2="50.4025" y2="102.083" gradientUnits="userSpaceOnUse">
|
|
13
|
+
<stop stop-color="#105EFF"/>
|
|
14
|
+
<stop offset="1" stop-color="#2E2E77"/>
|
|
15
|
+
</linearGradient>
|
|
16
|
+
<linearGradient id="paint1_linear_182_647" x1="141.706" y1="169.085" x2="61.445" y2="30.0709" gradientUnits="userSpaceOnUse">
|
|
17
|
+
<stop stop-color="#105EFF"/>
|
|
18
|
+
<stop offset="1" stop-color="#105EFF" stop-opacity="0.71"/>
|
|
19
|
+
</linearGradient>
|
|
20
|
+
</defs>
|
|
21
|
+
</svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-ellipsis-vertical"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-paperclip"><path d="m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg>
|