@shapesos/clay 0.9.0 → 0.11.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.
- package/README.md +46 -1
- package/dist/artifacts.cjs +741 -0
- package/dist/artifacts.cjs.map +1 -0
- package/dist/artifacts.d.cts +56 -0
- package/dist/artifacts.d.ts +56 -0
- package/dist/artifacts.js +23 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/blocks.cjs +1282 -0
- package/dist/blocks.cjs.map +1 -0
- package/dist/blocks.css +2 -0
- package/dist/blocks.d.cts +41 -0
- package/dist/blocks.d.ts +41 -0
- package/dist/blocks.js +31 -0
- package/dist/blocks.js.map +1 -0
- package/dist/button.d.cts +2 -2
- package/dist/button.d.ts +2 -2
- package/dist/chat.cjs +755 -281
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.d.cts +31 -10
- package/dist/chat.d.ts +31 -10
- package/dist/chat.js +8 -3
- package/dist/chunk-BX5TCEPR.js +436 -0
- package/dist/chunk-BX5TCEPR.js.map +1 -0
- package/dist/chunk-JGMN6W72.js +12 -0
- package/dist/chunk-JGMN6W72.js.map +1 -0
- package/dist/{chunk-27GJUWVN.js → chunk-JJUIBBBU.js} +14 -8
- package/dist/chunk-JJUIBBBU.js.map +1 -0
- package/dist/chunk-L35M3OD5.js +99 -0
- package/dist/chunk-L35M3OD5.js.map +1 -0
- package/dist/chunk-MEJESPTZ.js +1 -0
- package/dist/chunk-MEJESPTZ.js.map +1 -0
- package/dist/chunk-MXOPG747.js +238 -0
- package/dist/chunk-MXOPG747.js.map +1 -0
- package/dist/{chunk-MLCRDVQ2.js → chunk-OBOXCBDL.js} +13 -5
- package/dist/chunk-OBOXCBDL.js.map +1 -0
- package/dist/chunk-OUW6PUEB.js +223 -0
- package/dist/chunk-OUW6PUEB.js.map +1 -0
- package/dist/{chunk-TDMJUF4A.js → chunk-WPQQVKWY.js} +4 -4
- package/dist/icon.cjs +12 -4
- package/dist/icon.cjs.map +1 -1
- package/dist/icon.d.cts +19 -6
- package/dist/icon.d.ts +19 -6
- package/dist/icon.js +1 -1
- package/dist/index.cjs +789 -273
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +61 -21
- package/dist/lottie.d.cts +2 -2
- package/dist/lottie.d.ts +2 -2
- package/dist/table.cjs +142 -0
- package/dist/table.cjs.map +1 -0
- package/dist/table.d.cts +44 -0
- package/dist/table.d.ts +44 -0
- package/dist/table.js +24 -0
- package/dist/table.js.map +1 -0
- package/dist/text-area.d.cts +2 -2
- package/dist/text-area.d.ts +2 -2
- package/dist/text-area.js +2 -2
- package/dist/types-3Gzk7cRt.d.cts +121 -0
- package/dist/types-3Gzk7cRt.d.ts +121 -0
- package/dist/types-C9XX-Uhk.d.ts +68 -0
- package/dist/types-DuuRI4ll.d.cts +68 -0
- package/dist/utils.cjs +14 -7
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +18 -1
- package/dist/utils.d.ts +18 -1
- package/dist/utils.js +6 -4
- package/package.json +34 -4
- package/dist/chunk-27GJUWVN.js.map +0 -1
- package/dist/chunk-A77BGJH4.js +0 -458
- package/dist/chunk-A77BGJH4.js.map +0 -1
- package/dist/chunk-MLCRDVQ2.js.map +0 -1
- /package/dist/{chunk-TDMJUF4A.js.map → chunk-WPQQVKWY.js.map} +0 -0
package/dist/chunk-A77BGJH4.js
DELETED
|
@@ -1,458 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
IconButton
|
|
3
|
-
} from "./chunk-MLCRDVQ2.js";
|
|
4
|
-
import {
|
|
5
|
-
typographyMixin,
|
|
6
|
-
typographyTypes
|
|
7
|
-
} from "./chunk-SV24ONND.js";
|
|
8
|
-
import {
|
|
9
|
-
colors
|
|
10
|
-
} from "./chunk-JF3P66JF.js";
|
|
11
|
-
import {
|
|
12
|
-
markdownToPlainText
|
|
13
|
-
} from "./chunk-NMKKU2UG.js";
|
|
14
|
-
|
|
15
|
-
// src/components/chat/chat-message-content/chat-message-content.tsx
|
|
16
|
-
import ReactMarkdown from "react-markdown";
|
|
17
|
-
import remarkBreaks from "remark-breaks";
|
|
18
|
-
import remarkGfm from "remark-gfm";
|
|
19
|
-
|
|
20
|
-
// src/components/chat/scrollable-table/scrollable-table.tsx
|
|
21
|
-
import { useContext as useContext2 } from "react";
|
|
22
|
-
|
|
23
|
-
// src/components/chat/chat-context/chat-context.ts
|
|
24
|
-
import { createContext, useContext } from "react";
|
|
25
|
-
var ChatContext = createContext(null);
|
|
26
|
-
function useChatContext() {
|
|
27
|
-
const context = useContext(ChatContext);
|
|
28
|
-
if (!context) {
|
|
29
|
-
throw new Error("useChatContext must be used within a Chat.Root component");
|
|
30
|
-
}
|
|
31
|
-
return context;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// src/components/chat/scrollable-table/scrollable-table-styles.ts
|
|
35
|
-
import styled from "styled-components";
|
|
36
|
-
var TableContainer = styled.div`
|
|
37
|
-
position: relative;
|
|
38
|
-
margin-block: 8px 16px;
|
|
39
|
-
`;
|
|
40
|
-
var TableScroll = styled.div`
|
|
41
|
-
width: 100%;
|
|
42
|
-
overflow-x: auto;
|
|
43
|
-
overflow-y: hidden;
|
|
44
|
-
`;
|
|
45
|
-
var TableActionsWrapper = styled.div`
|
|
46
|
-
display: flex;
|
|
47
|
-
justify-content: flex-start;
|
|
48
|
-
margin-block: 8px 0;
|
|
49
|
-
`;
|
|
50
|
-
var TableActionsDivider = styled.div`
|
|
51
|
-
height: 1px;
|
|
52
|
-
background: ${colors["brown-40"]};
|
|
53
|
-
margin-block: 8px 0;
|
|
54
|
-
`;
|
|
55
|
-
|
|
56
|
-
// src/components/chat/scrollable-table/scrollable-table.tsx
|
|
57
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
58
|
-
function ScrollableTable({ node: _node, messageId, counter, ...props }) {
|
|
59
|
-
const currentIndex = counter ? counter.value : 0;
|
|
60
|
-
if (counter) {
|
|
61
|
-
counter.value += 1;
|
|
62
|
-
}
|
|
63
|
-
const context = useContext2(ChatContext);
|
|
64
|
-
const TableActions = context?.TableActions;
|
|
65
|
-
return /* @__PURE__ */ jsxs(TableContainer, { children: [
|
|
66
|
-
/* @__PURE__ */ jsx(TableScroll, { children: /* @__PURE__ */ jsx("table", { ...props }) }),
|
|
67
|
-
TableActions && messageId && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
68
|
-
/* @__PURE__ */ jsx(TableActionsWrapper, { children: /* @__PURE__ */ jsx(TableActions, { messageId, tableIndex: currentIndex }) }),
|
|
69
|
-
/* @__PURE__ */ jsx(TableActionsDivider, {})
|
|
70
|
-
] })
|
|
71
|
-
] });
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// src/components/chat/chat-message-content/chat-message-content-styles.ts
|
|
75
|
-
import styled2 from "styled-components";
|
|
76
|
-
var ContentWrapper = styled2.div`
|
|
77
|
-
${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};
|
|
78
|
-
color: ${colors["brown-100"]};
|
|
79
|
-
word-break: break-word;
|
|
80
|
-
|
|
81
|
-
& h1 {
|
|
82
|
-
${typographyMixin(typographyTypes.GEIST_HEADING_S_BOLD)};
|
|
83
|
-
margin-block: 20px;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
& h2 {
|
|
87
|
-
${typographyMixin(typographyTypes.GEIST_BODY_L_SEMI_BOLD)};
|
|
88
|
-
margin-block: 12px;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
& h3,
|
|
92
|
-
& h4,
|
|
93
|
-
& h5,
|
|
94
|
-
& h6 {
|
|
95
|
-
${typographyMixin(typographyTypes.GEIST_BODY_M_SEMI_BOLD)};
|
|
96
|
-
margin-block: 8px;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
& strong {
|
|
100
|
-
${typographyMixin(typographyTypes.GEIST_BODY_S_SEMI_BOLD)};
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
& p {
|
|
104
|
-
margin-block: 0px;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
& p + p {
|
|
108
|
-
margin-block: 8px 0px;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
& ul,
|
|
112
|
-
& ol {
|
|
113
|
-
margin-block: 16px;
|
|
114
|
-
padding-left: 20px;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
& li + li {
|
|
118
|
-
margin-block: 4px;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
& ol {
|
|
122
|
-
list-style-type: decimal;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
& ol ol {
|
|
126
|
-
list-style-type: lower-alpha;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
& ol ol ol {
|
|
130
|
-
list-style-type: lower-roman;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
& a {
|
|
134
|
-
color: inherit;
|
|
135
|
-
text-decoration-line: underline;
|
|
136
|
-
text-decoration-style: dotted;
|
|
137
|
-
text-decoration-thickness: auto;
|
|
138
|
-
text-underline-offset: auto;
|
|
139
|
-
text-underline-position: from-font;
|
|
140
|
-
transition: color 75ms ease-in-out;
|
|
141
|
-
|
|
142
|
-
&:hover {
|
|
143
|
-
color: ${colors["blue-600"]};
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
& hr {
|
|
148
|
-
border: none;
|
|
149
|
-
border-top: 1px solid ${colors["brown-40"]};
|
|
150
|
-
margin-block: 20px;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
& table {
|
|
154
|
-
margin: 0;
|
|
155
|
-
width: 100%;
|
|
156
|
-
border-collapse: collapse;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
& th,
|
|
160
|
-
& td {
|
|
161
|
-
border: none;
|
|
162
|
-
border-bottom: 1px solid ${colors["brown-40"]};
|
|
163
|
-
text-align: left;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
& th {
|
|
167
|
-
${typographyMixin(typographyTypes.GEIST_LABEL_CAPTION_MEDIUM)};
|
|
168
|
-
padding: 8px;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
& td {
|
|
172
|
-
${typographyMixin(typographyTypes.GEIST_BODY_XS_MEDIUM)};
|
|
173
|
-
padding: 16px 8px;
|
|
174
|
-
min-width: 150px;
|
|
175
|
-
width: 1%;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
& td strong {
|
|
179
|
-
font-weight: inherit;
|
|
180
|
-
font-size: inherit;
|
|
181
|
-
line-height: inherit;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
& blockquote {
|
|
185
|
-
margin-block: 4px;
|
|
186
|
-
margin-inline: 0px;
|
|
187
|
-
padding-left: 16px;
|
|
188
|
-
border-left: 4px solid ${colors["brown-40"]};
|
|
189
|
-
color: ${colors["brown-80"]};
|
|
190
|
-
}
|
|
191
|
-
`;
|
|
192
|
-
|
|
193
|
-
// src/components/chat/chat-message-content/chat-message-content.tsx
|
|
194
|
-
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
195
|
-
function ChatMessageContent({ content, messageId }) {
|
|
196
|
-
const counter = { value: 0 };
|
|
197
|
-
const sanitizedContent = content.split("\n").filter((line) => {
|
|
198
|
-
const t = line.trim();
|
|
199
|
-
return !(t.startsWith("<!-- table-title:") && t.endsWith("-->"));
|
|
200
|
-
}).join("\n");
|
|
201
|
-
const markdownComponents = {
|
|
202
|
-
table: ((tableProps) => /* @__PURE__ */ jsx2(ScrollableTable, { ...tableProps, messageId, counter }))
|
|
203
|
-
};
|
|
204
|
-
return /* @__PURE__ */ jsx2(ContentWrapper, { children: /* @__PURE__ */ jsx2(ReactMarkdown, { remarkPlugins: [remarkGfm, remarkBreaks], components: markdownComponents, children: sanitizedContent }) });
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// src/components/chat/chat-message-actions/chat-message-actions.tsx
|
|
208
|
-
import { useCallback as useCallback2 } from "react";
|
|
209
|
-
|
|
210
|
-
// node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs
|
|
211
|
-
import { forwardRef, createElement } from "react";
|
|
212
|
-
|
|
213
|
-
// node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs
|
|
214
|
-
var defaultAttributes = {
|
|
215
|
-
outline: {
|
|
216
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
217
|
-
width: 24,
|
|
218
|
-
height: 24,
|
|
219
|
-
viewBox: "0 0 24 24",
|
|
220
|
-
fill: "none",
|
|
221
|
-
stroke: "currentColor",
|
|
222
|
-
strokeWidth: 2,
|
|
223
|
-
strokeLinecap: "round",
|
|
224
|
-
strokeLinejoin: "round"
|
|
225
|
-
},
|
|
226
|
-
filled: {
|
|
227
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
228
|
-
width: 24,
|
|
229
|
-
height: 24,
|
|
230
|
-
viewBox: "0 0 24 24",
|
|
231
|
-
fill: "currentColor",
|
|
232
|
-
stroke: "none"
|
|
233
|
-
}
|
|
234
|
-
};
|
|
235
|
-
|
|
236
|
-
// node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs
|
|
237
|
-
var createReactComponent = (type, iconName, iconNamePascal, iconNode) => {
|
|
238
|
-
const Component = forwardRef(
|
|
239
|
-
({ color = "currentColor", size = 24, stroke = 2, title, className, children, ...rest }, ref) => createElement(
|
|
240
|
-
"svg",
|
|
241
|
-
{
|
|
242
|
-
ref,
|
|
243
|
-
...defaultAttributes[type],
|
|
244
|
-
width: size,
|
|
245
|
-
height: size,
|
|
246
|
-
className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(" "),
|
|
247
|
-
...type === "filled" ? {
|
|
248
|
-
fill: color
|
|
249
|
-
} : {
|
|
250
|
-
strokeWidth: stroke,
|
|
251
|
-
stroke: color
|
|
252
|
-
},
|
|
253
|
-
...rest
|
|
254
|
-
},
|
|
255
|
-
[
|
|
256
|
-
title && createElement("title", { key: "svg-title" }, title),
|
|
257
|
-
...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),
|
|
258
|
-
...Array.isArray(children) ? children : [children]
|
|
259
|
-
]
|
|
260
|
-
)
|
|
261
|
-
);
|
|
262
|
-
Component.displayName = `${iconNamePascal}`;
|
|
263
|
-
return Component;
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
// node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs
|
|
267
|
-
var __iconNode = [["path", { "d": "M5 12l5 5l10 -10", "key": "svg-0" }]];
|
|
268
|
-
var IconCheck = createReactComponent("outline", "check", "Check", __iconNode);
|
|
269
|
-
|
|
270
|
-
// node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.mjs
|
|
271
|
-
var __iconNode2 = [["path", { "d": "M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666", "key": "svg-0" }], ["path", { "d": "M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1", "key": "svg-1" }]];
|
|
272
|
-
var IconCopy = createReactComponent("outline", "copy", "Copy", __iconNode2);
|
|
273
|
-
|
|
274
|
-
// node_modules/@tabler/icons-react/dist/esm/icons/IconThumbDown.mjs
|
|
275
|
-
var __iconNode3 = [["path", { "d": "M7 13v-8a1 1 0 0 0 -1 -1h-2a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h3a4 4 0 0 1 4 4v1a2 2 0 0 0 4 0v-5h3a2 2 0 0 0 2 -2l-1 -5a2 3 0 0 0 -2 -2h-7a3 3 0 0 0 -3 3", "key": "svg-0" }]];
|
|
276
|
-
var IconThumbDown = createReactComponent("outline", "thumb-down", "ThumbDown", __iconNode3);
|
|
277
|
-
|
|
278
|
-
// node_modules/@tabler/icons-react/dist/esm/icons/IconThumbUp.mjs
|
|
279
|
-
var __iconNode4 = [["path", { "d": "M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3", "key": "svg-0" }]];
|
|
280
|
-
var IconThumbUp = createReactComponent("outline", "thumb-up", "ThumbUp", __iconNode4);
|
|
281
|
-
|
|
282
|
-
// src/components/chat/hooks/use-copy-to-clipboard.ts
|
|
283
|
-
import { useState, useCallback, useRef, useEffect } from "react";
|
|
284
|
-
|
|
285
|
-
// src/utils/clipboard.ts
|
|
286
|
-
function copyToClipboard(text, options) {
|
|
287
|
-
navigator.clipboard.writeText(text).then(
|
|
288
|
-
() => options?.onSuccess?.(),
|
|
289
|
-
(error) => options?.onFailure?.(error)
|
|
290
|
-
);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
// src/components/chat/hooks/use-copy-to-clipboard.ts
|
|
294
|
-
var RESET_DELAY_MS = 2e3;
|
|
295
|
-
function useCopyToClipboard() {
|
|
296
|
-
const [isCopied, setIsCopied] = useState(false);
|
|
297
|
-
const timeoutRef = useRef(null);
|
|
298
|
-
useEffect(() => {
|
|
299
|
-
return () => {
|
|
300
|
-
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
301
|
-
};
|
|
302
|
-
}, []);
|
|
303
|
-
const copy = useCallback((text) => {
|
|
304
|
-
copyToClipboard(markdownToPlainText(text), {
|
|
305
|
-
onSuccess: () => {
|
|
306
|
-
setIsCopied(true);
|
|
307
|
-
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
308
|
-
timeoutRef.current = setTimeout(() => {
|
|
309
|
-
setIsCopied(false);
|
|
310
|
-
timeoutRef.current = null;
|
|
311
|
-
}, RESET_DELAY_MS);
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
}, []);
|
|
315
|
-
return { isCopied, copy };
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// src/components/chat/constants.ts
|
|
319
|
-
var MESSAGE_ROLE = {
|
|
320
|
-
USER: "user",
|
|
321
|
-
ASSISTANT: "assistant"
|
|
322
|
-
};
|
|
323
|
-
|
|
324
|
-
// src/components/chat/chat-message-actions/chat-message-actions-styles.ts
|
|
325
|
-
import styled3 from "styled-components";
|
|
326
|
-
var FADE_DURATION_MS = 150;
|
|
327
|
-
var ANIMATE_DURATION_MS = 200;
|
|
328
|
-
var ActionsContainer = styled3.div`
|
|
329
|
-
display: flex;
|
|
330
|
-
opacity: ${({ $role }) => $role === MESSAGE_ROLE.ASSISTANT ? 1 : 0};
|
|
331
|
-
pointer-events: ${({ $role }) => $role === MESSAGE_ROLE.ASSISTANT ? "auto" : "none"};
|
|
332
|
-
transition: opacity ${FADE_DURATION_MS}ms ease;
|
|
333
|
-
`;
|
|
334
|
-
var AnimatedAction = styled3.div`
|
|
335
|
-
display: flex;
|
|
336
|
-
overflow: hidden;
|
|
337
|
-
max-width: ${({ $visible }) => $visible ? "40px" : "0"};
|
|
338
|
-
opacity: ${({ $visible }) => $visible ? 1 : 0};
|
|
339
|
-
transition: max-width ${ANIMATE_DURATION_MS}ms ease, opacity ${ANIMATE_DURATION_MS}ms ease;
|
|
340
|
-
`;
|
|
341
|
-
|
|
342
|
-
// src/components/chat/chat-message-actions/chat-message-actions.tsx
|
|
343
|
-
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
344
|
-
function ChatMessageActions({ className, messageId, content, role, isHelpful }) {
|
|
345
|
-
const { onCopyMessage, onThumbUpClick, onThumbDownClick } = useChatContext();
|
|
346
|
-
const { isCopied, copy } = useCopyToClipboard();
|
|
347
|
-
const handleCopy = useCallback2(() => {
|
|
348
|
-
copy(content);
|
|
349
|
-
onCopyMessage?.(messageId);
|
|
350
|
-
}, [content, messageId, copy, onCopyMessage]);
|
|
351
|
-
const handleThumbUp = useCallback2(() => {
|
|
352
|
-
onThumbUpClick?.(messageId, isHelpful === true ? null : true);
|
|
353
|
-
}, [messageId, isHelpful, onThumbUpClick]);
|
|
354
|
-
const handleThumbDown = useCallback2(() => {
|
|
355
|
-
onThumbDownClick?.(messageId, isHelpful === false ? null : false);
|
|
356
|
-
}, [messageId, isHelpful, onThumbDownClick]);
|
|
357
|
-
const isAssistant = role === MESSAGE_ROLE.ASSISTANT;
|
|
358
|
-
const hasFeedback = isAssistant && (onThumbUpClick || onThumbDownClick);
|
|
359
|
-
return /* @__PURE__ */ jsxs2(ActionsContainer, { $role: role, className, children: [
|
|
360
|
-
/* @__PURE__ */ jsx3(
|
|
361
|
-
IconButton,
|
|
362
|
-
{
|
|
363
|
-
icon: isCopied ? IconCheck : IconCopy,
|
|
364
|
-
onClick: handleCopy,
|
|
365
|
-
"aria-label": isCopied ? "Copied" : "Copy message"
|
|
366
|
-
}
|
|
367
|
-
),
|
|
368
|
-
hasFeedback && /* @__PURE__ */ jsx3(AnimatedAction, { $visible: isHelpful !== false, children: /* @__PURE__ */ jsx3(
|
|
369
|
-
IconButton,
|
|
370
|
-
{
|
|
371
|
-
icon: IconThumbUp,
|
|
372
|
-
onClick: handleThumbUp,
|
|
373
|
-
isSelected: isHelpful === true,
|
|
374
|
-
"aria-label": "Good response"
|
|
375
|
-
}
|
|
376
|
-
) }),
|
|
377
|
-
hasFeedback && /* @__PURE__ */ jsx3(AnimatedAction, { $visible: isHelpful !== true, children: /* @__PURE__ */ jsx3(
|
|
378
|
-
IconButton,
|
|
379
|
-
{
|
|
380
|
-
icon: IconThumbDown,
|
|
381
|
-
onClick: handleThumbDown,
|
|
382
|
-
isSelected: isHelpful === false,
|
|
383
|
-
"aria-label": "Bad response"
|
|
384
|
-
}
|
|
385
|
-
) })
|
|
386
|
-
] });
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
// src/components/chat/chat-message/chat-message-styles.ts
|
|
390
|
-
import styled4 from "styled-components";
|
|
391
|
-
var MessageRow = styled4.div`
|
|
392
|
-
display: flex;
|
|
393
|
-
justify-content: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "flex-end" : "flex-start"};
|
|
394
|
-
|
|
395
|
-
&:hover ${ActionsContainer} {
|
|
396
|
-
opacity: 1;
|
|
397
|
-
pointer-events: auto;
|
|
398
|
-
}
|
|
399
|
-
`;
|
|
400
|
-
var MessageContainer = styled4.div`
|
|
401
|
-
display: flex;
|
|
402
|
-
flex-direction: column;
|
|
403
|
-
align-items: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "flex-end" : "flex-start"};
|
|
404
|
-
max-width: 90%;
|
|
405
|
-
width: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "auto" : "100%"};
|
|
406
|
-
gap: 12px;
|
|
407
|
-
`;
|
|
408
|
-
var MessageBubble = styled4.div`
|
|
409
|
-
${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};
|
|
410
|
-
color: ${colors["brown-100"]};
|
|
411
|
-
background: ${({ $role }) => $role === MESSAGE_ROLE.USER ? colors.white : "transparent"};
|
|
412
|
-
padding: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "12px 16px" : "0"};
|
|
413
|
-
border-radius: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "16px" : "0"};
|
|
414
|
-
max-width: 100%;
|
|
415
|
-
min-width: 0;
|
|
416
|
-
`;
|
|
417
|
-
|
|
418
|
-
// src/components/chat/chat-message/chat-message.tsx
|
|
419
|
-
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
420
|
-
function ChatMessage({ message }) {
|
|
421
|
-
return /* @__PURE__ */ jsx4(MessageRow, { $role: message.role, role: "article", "aria-label": `${message.role} message`, children: /* @__PURE__ */ jsxs3(MessageContainer, { $role: message.role, children: [
|
|
422
|
-
/* @__PURE__ */ jsx4(MessageBubble, { $role: message.role, children: /* @__PURE__ */ jsx4(ChatMessageContent, { content: message.content, messageId: message.id }) }),
|
|
423
|
-
/* @__PURE__ */ jsx4(
|
|
424
|
-
ChatMessageActions,
|
|
425
|
-
{
|
|
426
|
-
messageId: message.id,
|
|
427
|
-
content: message.content,
|
|
428
|
-
role: message.role,
|
|
429
|
-
isHelpful: message.isHelpful
|
|
430
|
-
}
|
|
431
|
-
)
|
|
432
|
-
] }) });
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
export {
|
|
436
|
-
ChatContext,
|
|
437
|
-
useChatContext,
|
|
438
|
-
useCopyToClipboard,
|
|
439
|
-
MESSAGE_ROLE,
|
|
440
|
-
ChatMessage
|
|
441
|
-
};
|
|
442
|
-
/*! Bundled license information:
|
|
443
|
-
|
|
444
|
-
@tabler/icons-react/dist/esm/defaultAttributes.mjs:
|
|
445
|
-
@tabler/icons-react/dist/esm/createReactComponent.mjs:
|
|
446
|
-
@tabler/icons-react/dist/esm/icons/IconCheck.mjs:
|
|
447
|
-
@tabler/icons-react/dist/esm/icons/IconCopy.mjs:
|
|
448
|
-
@tabler/icons-react/dist/esm/icons/IconThumbDown.mjs:
|
|
449
|
-
@tabler/icons-react/dist/esm/icons/IconThumbUp.mjs:
|
|
450
|
-
@tabler/icons-react/dist/esm/tabler-icons-react.mjs:
|
|
451
|
-
(**
|
|
452
|
-
* @license @tabler/icons-react v3.37.1 - MIT
|
|
453
|
-
*
|
|
454
|
-
* This source code is licensed under the MIT license.
|
|
455
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
456
|
-
*)
|
|
457
|
-
*/
|
|
458
|
-
//# sourceMappingURL=chunk-A77BGJH4.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/chat/chat-message-content/chat-message-content.tsx","../src/components/chat/scrollable-table/scrollable-table.tsx","../src/components/chat/chat-context/chat-context.ts","../src/components/chat/scrollable-table/scrollable-table-styles.ts","../src/components/chat/chat-message-content/chat-message-content-styles.ts","../src/components/chat/chat-message-actions/chat-message-actions.tsx","../node_modules/@tabler/icons-react/src/defaultAttributes.ts","../node_modules/@tabler/icons-react/src/createReactComponent.ts","../node_modules/@tabler/icons-react/src/icons/IconCheck.ts","../node_modules/@tabler/icons-react/src/icons/IconCopy.ts","../node_modules/@tabler/icons-react/src/icons/IconThumbDown.ts","../node_modules/@tabler/icons-react/src/icons/IconThumbUp.ts","../src/components/chat/hooks/use-copy-to-clipboard.ts","../src/utils/clipboard.ts","../src/components/chat/constants.ts","../src/components/chat/chat-message-actions/chat-message-actions-styles.ts","../src/components/chat/chat-message/chat-message-styles.ts","../src/components/chat/chat-message/chat-message.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkBreaks from \"remark-breaks\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { ScrollableTable, type TableCounter } from \"../scrollable-table/scrollable-table\";\nimport { ContentWrapper } from \"./chat-message-content-styles\";\n\n/** Props for the ChatMessageContent component. */\ninterface ChatMessageContentProps {\n /** The markdown string to render. */\n content: string;\n /** The ID of the message this content belongs to. Used for table action callbacks. */\n messageId?: string;\n}\n\n/** Renders markdown content with GFM support (tables, strikethrough) and line breaks. */\nexport function ChatMessageContent({ content, messageId }: ChatMessageContentProps): ReactNode {\n const counter: TableCounter = { value: 0 };\n\n const sanitizedContent = content\n .split(\"\\n\")\n .filter((line) => {\n const t = line.trim();\n return !(t.startsWith(\"<!-- table-title:\") && t.endsWith(\"-->\"));\n })\n .join(\"\\n\");\n\n const markdownComponents = {\n table: ((tableProps: { node?: unknown; children?: ReactNode }) => (\n <ScrollableTable {...tableProps} messageId={messageId} counter={counter} />\n )) as React.ComponentType<unknown>,\n };\n\n return (\n <ContentWrapper>\n <ReactMarkdown remarkPlugins={[remarkGfm, remarkBreaks]} components={markdownComponents}>\n {sanitizedContent}\n </ReactMarkdown>\n </ContentWrapper>\n );\n}\n","import { type ReactNode, useContext } from \"react\";\n\nimport { ChatContext } from \"../chat-context/chat-context\";\nimport { TableActionsWrapper, TableActionsDivider, TableContainer, TableScroll } from \"./scrollable-table-styles\";\n\n/** Mutable counter used to assign sequential table indices during a single render pass. */\nexport interface TableCounter {\n /** The current value; incremented each time a table component is rendered. */\n value: number;\n}\n\n/** Props for the ScrollableTable component. */\ninterface ScrollableTableProps {\n /** Unused node prop from react-markdown. */\n node?: unknown;\n /** Table children elements. */\n children?: ReactNode;\n /** The ID of the parent message. */\n messageId?: string;\n /** Mutable counter for tracking table indices. */\n counter?: TableCounter;\n}\n\n/** Renders a table inside a horizontally scrollable wrapper with optional actions below. */\nexport function ScrollableTable({ node: _node, messageId, counter, ...props }: ScrollableTableProps): ReactNode {\n const currentIndex = counter ? counter.value : 0;\n if (counter) {\n // eslint-disable-next-line react-hooks/immutability -- Counter is an intentionally mutable shared object for sequential table indexing\n counter.value += 1;\n }\n\n const context = useContext(ChatContext);\n const TableActions = context?.TableActions;\n\n return (\n <TableContainer>\n <TableScroll>\n <table {...props} />\n </TableScroll>\n {TableActions && messageId && (\n <>\n <TableActionsWrapper>\n <TableActions messageId={messageId} tableIndex={currentIndex} />\n </TableActionsWrapper>\n <TableActionsDivider />\n </>\n )}\n </TableContainer>\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { ChatContextValue } from \"../types\";\n\nexport const ChatContext = createContext<ChatContextValue | null>(null);\n\nexport function useChatContext(): ChatContextValue {\n const context = useContext(ChatContext);\n if (!context) {\n throw new Error(\"useChatContext must be used within a Chat.Root component\");\n }\n return context;\n}\n","import styled from \"styled-components\";\n\nimport { colors } from \"@/tokens/colors\";\n\nexport const TableContainer = styled.div`\n position: relative;\n margin-block: 8px 16px;\n`;\n\nexport const TableScroll = styled.div`\n width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n`;\n\nexport const TableActionsWrapper = styled.div`\n display: flex;\n justify-content: flex-start;\n margin-block: 8px 0;\n`;\n\nexport const TableActionsDivider = styled.div`\n height: 1px;\n background: ${colors[\"brown-40\"]};\n margin-block: 8px 0;\n`;\n","import styled from \"styled-components\";\n\nimport { colors } from \"../../../tokens/colors\";\nimport { typographyMixin, typographyTypes } from \"../../../tokens/typography\";\n\nexport const ContentWrapper = styled.div`\n ${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};\n color: ${colors[\"brown-100\"]};\n word-break: break-word;\n\n & h1 {\n ${typographyMixin(typographyTypes.GEIST_HEADING_S_BOLD)};\n margin-block: 20px;\n }\n\n & h2 {\n ${typographyMixin(typographyTypes.GEIST_BODY_L_SEMI_BOLD)};\n margin-block: 12px;\n }\n\n & h3,\n & h4,\n & h5,\n & h6 {\n ${typographyMixin(typographyTypes.GEIST_BODY_M_SEMI_BOLD)};\n margin-block: 8px;\n }\n\n & strong {\n ${typographyMixin(typographyTypes.GEIST_BODY_S_SEMI_BOLD)};\n }\n\n & p {\n margin-block: 0px;\n }\n\n & p + p {\n margin-block: 8px 0px;\n }\n\n & ul,\n & ol {\n margin-block: 16px;\n padding-left: 20px;\n }\n\n & li + li {\n margin-block: 4px;\n }\n\n & ol {\n list-style-type: decimal;\n }\n\n & ol ol {\n list-style-type: lower-alpha;\n }\n\n & ol ol ol {\n list-style-type: lower-roman;\n }\n\n & a {\n color: inherit;\n text-decoration-line: underline;\n text-decoration-style: dotted;\n text-decoration-thickness: auto;\n text-underline-offset: auto;\n text-underline-position: from-font;\n transition: color 75ms ease-in-out;\n\n &:hover {\n color: ${colors[\"blue-600\"]};\n }\n }\n\n & hr {\n border: none;\n border-top: 1px solid ${colors[\"brown-40\"]};\n margin-block: 20px;\n }\n\n & table {\n margin: 0;\n width: 100%;\n border-collapse: collapse;\n }\n\n & th,\n & td {\n border: none;\n border-bottom: 1px solid ${colors[\"brown-40\"]};\n text-align: left;\n }\n\n & th {\n ${typographyMixin(typographyTypes.GEIST_LABEL_CAPTION_MEDIUM)};\n padding: 8px;\n }\n\n & td {\n ${typographyMixin(typographyTypes.GEIST_BODY_XS_MEDIUM)};\n padding: 16px 8px;\n min-width: 150px;\n width: 1%;\n }\n\n & td strong {\n font-weight: inherit;\n font-size: inherit;\n line-height: inherit;\n }\n\n & blockquote {\n margin-block: 4px;\n margin-inline: 0px;\n padding-left: 16px;\n border-left: 4px solid ${colors[\"brown-40\"]};\n color: ${colors[\"brown-80\"]};\n }\n`;\n","import { useCallback } from \"react\";\nimport { IconCopy, IconCheck, IconThumbUp, IconThumbDown } from \"@tabler/icons-react\";\n\nimport { IconButton } from \"../../icon-button/icon-button\";\nimport { useChatContext } from \"../chat-context/chat-context\";\nimport { useCopyToClipboard } from \"../hooks/use-copy-to-clipboard\";\nimport { MESSAGE_ROLE } from \"../constants\";\nimport type { MessageRole } from \"../types\";\nimport { ActionsContainer, AnimatedAction } from \"./chat-message-actions-styles\";\n\ninterface ChatMessageActionsProps {\n className?: string;\n messageId: string;\n content: string;\n role: MessageRole;\n isHelpful?: boolean | null;\n}\n\nexport function ChatMessageActions({ className, messageId, content, role, isHelpful }: ChatMessageActionsProps) {\n const { onCopyMessage, onThumbUpClick, onThumbDownClick } = useChatContext();\n const { isCopied, copy } = useCopyToClipboard();\n\n const handleCopy = useCallback(() => {\n copy(content);\n onCopyMessage?.(messageId);\n }, [content, messageId, copy, onCopyMessage]);\n\n const handleThumbUp = useCallback(() => {\n onThumbUpClick?.(messageId, isHelpful === true ? null : true);\n }, [messageId, isHelpful, onThumbUpClick]);\n\n const handleThumbDown = useCallback(() => {\n onThumbDownClick?.(messageId, isHelpful === false ? null : false);\n }, [messageId, isHelpful, onThumbDownClick]);\n\n const isAssistant = role === MESSAGE_ROLE.ASSISTANT;\n const hasFeedback = isAssistant && (onThumbUpClick || onThumbDownClick);\n\n return (\n <ActionsContainer $role={role} className={className}>\n <IconButton\n icon={isCopied ? IconCheck : IconCopy}\n onClick={handleCopy}\n aria-label={isCopied ? \"Copied\" : \"Copy message\"}\n />\n\n {hasFeedback && (\n <AnimatedAction $visible={isHelpful !== false}>\n <IconButton\n icon={IconThumbUp}\n onClick={handleThumbUp}\n isSelected={isHelpful === true}\n aria-label=\"Good response\"\n />\n </AnimatedAction>\n )}\n\n {hasFeedback && (\n <AnimatedAction $visible={isHelpful !== true}>\n <IconButton\n icon={IconThumbDown}\n onClick={handleThumbDown}\n isSelected={isHelpful === false}\n aria-label=\"Bad response\"\n />\n </AnimatedAction>\n )}\n </ActionsContainer>\n );\n}\n","export default {\n outline: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n filled: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n },\n};\n","import { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport type { IconNode, IconProps, Icon } from './types';\n\nconst createReactComponent = (\n type: 'outline' | 'filled',\n iconName: string,\n iconNamePascal: string,\n iconNode: IconNode,\n) => {\n const Component = forwardRef<SVGSVGElement, IconProps>(\n (\n { color = 'currentColor', size = 24, stroke = 2, title, className, children, ...rest }: IconProps,\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes[type],\n width: size,\n height: size,\n className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(' '),\n ...(type === 'filled'\n ? {\n fill: color,\n }\n : {\n strokeWidth: stroke,\n stroke: color,\n }),\n ...rest,\n },\n [\n title && createElement('title', { key: 'svg-title' }, title),\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n );\n\n Component.displayName = `${iconNamePascal}`;\n\n return Component;\n};\n\nexport default createReactComponent;\n","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M5 12l5 5l10 -10\",\"key\":\"svg-0\"}]]\n\nconst IconCheck = createReactComponent('outline', 'check', 'Check', __iconNode);\n\nexport default IconCheck;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1\",\"key\":\"svg-1\"}]]\n\nconst IconCopy = createReactComponent('outline', 'copy', 'Copy', __iconNode);\n\nexport default IconCopy;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M7 13v-8a1 1 0 0 0 -1 -1h-2a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h3a4 4 0 0 1 4 4v1a2 2 0 0 0 4 0v-5h3a2 2 0 0 0 2 -2l-1 -5a2 3 0 0 0 -2 -2h-7a3 3 0 0 0 -3 3\",\"key\":\"svg-0\"}]]\n\nconst IconThumbDown = createReactComponent('outline', 'thumb-down', 'ThumbDown', __iconNode);\n\nexport default IconThumbDown;","import createReactComponent from '../createReactComponent';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [[\"path\",{\"d\":\"M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3\",\"key\":\"svg-0\"}]]\n\nconst IconThumbUp = createReactComponent('outline', 'thumb-up', 'ThumbUp', __iconNode);\n\nexport default IconThumbUp;","import { useState, useCallback, useRef, useEffect } from \"react\";\n\nimport { copyToClipboard } from \"@/utils/clipboard\";\nimport { markdownToPlainText } from \"@/utils/markdown-to-plain-text\";\n\nconst RESET_DELAY_MS = 2000;\n\ninterface UseCopyToClipboardResult {\n isCopied: boolean;\n copy: (text: string) => void;\n}\n\nexport function useCopyToClipboard(): UseCopyToClipboardResult {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n const copy = useCallback((text: string) => {\n copyToClipboard(markdownToPlainText(text), {\n onSuccess: () => {\n setIsCopied(true);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setIsCopied(false);\n timeoutRef.current = null;\n }, RESET_DELAY_MS);\n },\n });\n }, []);\n\n return { isCopied, copy };\n}\n","/** Options for the {@link copyToClipboard} function. */\ninterface CopyToClipboardOptions {\n /** Called after the text has been successfully written to the clipboard. */\n onSuccess?: () => void;\n /** Called if the clipboard write fails (e.g., permission denied). */\n onFailure?: (error: unknown) => void;\n}\n\n/**\n * Copies text to the system clipboard using the Clipboard API.\n * @param text - The string to copy.\n * @param options - Optional success/failure callbacks.\n */\nexport function copyToClipboard(text: string, options?: CopyToClipboardOptions): void {\n navigator.clipboard.writeText(text).then(\n () => options?.onSuccess?.(),\n (error) => options?.onFailure?.(error)\n );\n}\n","export const MESSAGE_ROLE = {\n USER: \"user\",\n ASSISTANT: \"assistant\",\n} as const;\n","import styled from \"styled-components\";\n\nimport { MESSAGE_ROLE } from \"../constants\";\nimport type { MessageRole } from \"../types\";\n\nconst FADE_DURATION_MS = 150;\nconst ANIMATE_DURATION_MS = 200;\n\nexport const ActionsContainer = styled.div<{ $role: MessageRole }>`\n display: flex;\n opacity: ${({ $role }) => ($role === MESSAGE_ROLE.ASSISTANT ? 1 : 0)};\n pointer-events: ${({ $role }) => ($role === MESSAGE_ROLE.ASSISTANT ? \"auto\" : \"none\")};\n transition: opacity ${FADE_DURATION_MS}ms ease;\n`;\n\nexport const AnimatedAction = styled.div<{ $visible: boolean }>`\n display: flex;\n overflow: hidden;\n max-width: ${({ $visible }) => ($visible ? \"40px\" : \"0\")};\n opacity: ${({ $visible }) => ($visible ? 1 : 0)};\n transition: max-width ${ANIMATE_DURATION_MS}ms ease, opacity ${ANIMATE_DURATION_MS}ms ease;\n`;\n","import styled from \"styled-components\";\n\nimport { colors } from \"../../../tokens/colors\";\nimport { typographyMixin, typographyTypes } from \"../../../tokens/typography\";\nimport { ActionsContainer } from \"../chat-message-actions/chat-message-actions-styles\";\nimport { MESSAGE_ROLE } from \"../constants\";\nimport type { MessageRole } from \"../types\";\n\nexport const MessageRow = styled.div<{ $role: MessageRole }>`\n display: flex;\n justify-content: ${({ $role }) => ($role === MESSAGE_ROLE.USER ? \"flex-end\" : \"flex-start\")};\n\n &:hover ${ActionsContainer} {\n opacity: 1;\n pointer-events: auto;\n }\n`;\n\nexport const MessageContainer = styled.div<{ $role: MessageRole }>`\n display: flex;\n flex-direction: column;\n align-items: ${({ $role }) => ($role === MESSAGE_ROLE.USER ? \"flex-end\" : \"flex-start\")};\n max-width: 90%;\n width: ${({ $role }) => ($role === MESSAGE_ROLE.USER ? \"auto\" : \"100%\")};\n gap: 12px;\n`;\n\nexport const MessageBubble = styled.div<{ $role: MessageRole }>`\n ${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};\n color: ${colors[\"brown-100\"]};\n background: ${({ $role }) => ($role === MESSAGE_ROLE.USER ? colors.white : \"transparent\")};\n padding: ${({ $role }) => ($role === MESSAGE_ROLE.USER ? \"12px 16px\" : \"0\")};\n border-radius: ${({ $role }) => ($role === MESSAGE_ROLE.USER ? \"16px\" : \"0\")};\n max-width: 100%;\n min-width: 0;\n`;\n","import type { ChatMessage as ChatMessageType } from \"../types\";\nimport { ChatMessageContent } from \"../chat-message-content/chat-message-content\";\nimport { ChatMessageActions } from \"../chat-message-actions/chat-message-actions\";\nimport { MessageRow, MessageBubble, MessageContainer } from \"./chat-message-styles\";\n\ninterface ChatMessageProps {\n message: ChatMessageType;\n}\n\nexport function ChatMessage({ message }: ChatMessageProps) {\n return (\n <MessageRow $role={message.role} role=\"article\" aria-label={`${message.role} message`}>\n <MessageContainer $role={message.role}>\n <MessageBubble $role={message.role}>\n <ChatMessageContent content={message.content} messageId={message.id} />\n </MessageBubble>\n <ChatMessageActions\n messageId={message.id}\n content={message.content}\n role={message.role}\n isHelpful={message.isHelpful}\n />\n </MessageContainer>\n </MessageRow>\n );\n}\n"],"mappings":"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","names":["useContext","useContext","styled","styled","jsx","useCallback","__iconNode","__iconNode","__iconNode","styled","styled","jsx","jsxs","useCallback","styled","styled","jsx","jsxs"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/icon-button/icon-button-styles.ts","../src/components/icon-button/icon-button.tsx"],"sourcesContent":["import styled from \"styled-components\";\n\nimport { colors } from \"../../tokens/colors\";\nimport type { IconButtonSize, IconButtonVariant } from \"./types\";\n\nconst PADDING: Record<IconButtonVariant, Record<IconButtonSize, string>> = {\n short: {\n small: \"4px\",\n medium: \"6px\",\n },\n long: {\n small: \"4px 6px\",\n medium: \"6px 10px\",\n },\n};\n\nconst BORDER_RADIUS: Record<IconButtonSize, number> = {\n small: 6,\n medium: 10,\n};\n\nexport const Button = styled.button<{\n $size: IconButtonSize;\n $variant: IconButtonVariant;\n $isSelected: boolean;\n}>`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${({ $size, $variant }) => PADDING[$variant][$size]};\n border: none;\n border-radius: ${({ $size }) => BORDER_RADIUS[$size]}px;\n background: ${({ $isSelected }) => ($isSelected ? colors[\"brown-40\"] : \"transparent\")};\n color: ${colors[\"brown-100\"]};\n cursor: pointer;\n transition: background-color 100ms ease;\n\n &:hover {\n background: ${({ $isSelected }) => ($isSelected ? colors[\"brown-40\"] : colors[\"brown-20\"])};\n }\n\n &:active {\n background: ${colors[\"brown-40\"]};\n }\n\n &:disabled {\n color: ${colors[\"brown-50\"]};\n background: transparent;\n cursor: not-allowed;\n }\n`;\n","import { Icon } from \"../icon/icon\";\nimport { Button } from \"./icon-button-styles\";\nimport type { IconButtonProps, IconButtonSize } from \"./types\";\n\nconst ICON_SIZE_BY_BUTTON_SIZE: Record<IconButtonSize, number> = {\n small: 16,\n medium: 20,\n};\n\nexport function IconButton({\n icon,\n size = \"small\",\n variant = \"short\",\n isSelected = false,\n disabled = false,\n onClick,\n className,\n id,\n as,\n \"aria-label\": ariaLabel,\n}: IconButtonProps): React.ReactNode {\n return (\n <Button\n className={className}\n id={id}\n as={as}\n $size={size}\n $variant={variant}\n $isSelected={isSelected}\n disabled={disabled}\n onClick={disabled ? undefined : onClick}\n aria-label={ariaLabel}\n >\n <Icon icon={icon} size={ICON_SIZE_BY_BUTTON_SIZE[size]} />\n </Button>\n );\n}\n"],"mappings":";;;;;;;;AAAA,OAAO,YAAY;AAKnB,IAAM,UAAqE;AAAA,EACzE,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,gBAAgD;AAAA,EACpD,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,IAAM,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA,aAQhB,CAAC,EAAE,OAAO,SAAS,MAAM,QAAQ,QAAQ,EAAE,KAAK,CAAC;AAAA;AAAA,mBAE3C,CAAC,EAAE,MAAM,MAAM,cAAc,KAAK,CAAC;AAAA,gBACtC,CAAC,EAAE,YAAY,MAAO,cAAc,OAAO,UAAU,IAAI,aAAc;AAAA,WAC5E,OAAO,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKZ,CAAC,EAAE,YAAY,MAAO,cAAc,OAAO,UAAU,IAAI,OAAO,UAAU,CAAE;AAAA;AAAA;AAAA;AAAA,kBAI5E,OAAO,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,aAIvB,OAAO,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;;;ACbzB;AA7BN,IAAM,2BAA2D;AAAA,EAC/D,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAqC;AACnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,MACV,aAAa;AAAA,MACb;AAAA,MACA,SAAS,WAAW,SAAY;AAAA,MAChC,cAAY;AAAA,MAEZ,8BAAC,QAAK,MAAY,MAAM,yBAAyB,IAAI,GAAG;AAAA;AAAA,EAC1D;AAEJ;","names":[]}
|
|
File without changes
|