@shapesos/clay 0.4.1 → 0.5.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/dist/chat.cjs +199 -87
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.d.cts +6 -1
- package/dist/chat.d.ts +6 -1
- package/dist/chat.js +8 -4
- package/dist/chunk-DRBRT57F.js +1 -0
- package/dist/chunk-DRBRT57F.js.map +1 -0
- package/dist/chunk-JC2RQL5O.js +76 -0
- package/dist/chunk-JC2RQL5O.js.map +1 -0
- package/dist/{chunk-6HNZQ2BF.js → chunk-JF3P66JF.js} +2 -1
- package/dist/chunk-JF3P66JF.js.map +1 -0
- package/dist/chunk-K2Q5MQWJ.js +17 -0
- package/dist/chunk-K2Q5MQWJ.js.map +1 -0
- package/dist/chunk-MLCRDVQ2.js +89 -0
- package/dist/chunk-MLCRDVQ2.js.map +1 -0
- package/dist/chunk-OLJIJYB5.js +46 -0
- package/dist/chunk-OLJIJYB5.js.map +1 -0
- package/dist/{chunk-EPS4LOOW.js → chunk-PCBRMJJJ.js} +141 -65
- package/dist/chunk-PCBRMJJJ.js.map +1 -0
- package/dist/chunk-SMTOVZ3O.js +19 -0
- package/dist/chunk-SMTOVZ3O.js.map +1 -0
- package/dist/{chunk-A6DKIFWS.js → chunk-WQ2QTUYA.js} +9 -1
- package/dist/chunk-WQ2QTUYA.js.map +1 -0
- package/dist/chunk-WZHNMC6P.js +77 -0
- package/dist/chunk-WZHNMC6P.js.map +1 -0
- package/dist/icon.cjs +31 -16
- package/dist/icon.cjs.map +1 -1
- package/dist/icon.d.cts +6 -2
- package/dist/icon.d.ts +6 -2
- package/dist/icon.js +5 -3
- package/dist/index.cjs +297 -105
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -20
- package/dist/index.d.ts +5 -20
- package/dist/index.js +32 -74
- package/dist/index.js.map +1 -1
- package/dist/keyboard-shortcut.cjs +238 -0
- package/dist/keyboard-shortcut.cjs.map +1 -0
- package/dist/keyboard-shortcut.d.cts +19 -0
- package/dist/keyboard-shortcut.d.ts +19 -0
- package/dist/keyboard-shortcut.js +14 -0
- package/dist/keyboard-shortcut.js.map +1 -0
- package/dist/text-area.cjs +497 -0
- package/dist/text-area.cjs.map +1 -0
- package/dist/text-area.d.cts +18 -0
- package/dist/text-area.d.ts +18 -0
- package/dist/text-area.js +11 -0
- package/dist/text-area.js.map +1 -0
- package/dist/tokens.cjs +9 -0
- package/dist/tokens.cjs.map +1 -1
- package/dist/tokens.d.cts +2 -0
- package/dist/tokens.d.ts +2 -0
- package/dist/tokens.js +2 -2
- package/dist/utils.cjs +60 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +7 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +13 -0
- package/dist/utils.js.map +1 -0
- package/package.json +17 -1
- package/dist/chunk-6HNZQ2BF.js.map +0 -1
- package/dist/chunk-A6DKIFWS.js.map +0 -1
- package/dist/chunk-AEXYOY5H.js +0 -115
- package/dist/chunk-AEXYOY5H.js.map +0 -1
- package/dist/chunk-EPS4LOOW.js.map +0 -1
package/dist/chat.cjs
CHANGED
|
@@ -32,6 +32,7 @@ var chat_exports = {};
|
|
|
32
32
|
__export(chat_exports, {
|
|
33
33
|
ChatContext: () => ChatContext,
|
|
34
34
|
ChatMessage: () => ChatMessage,
|
|
35
|
+
MESSAGE_ROLE: () => MESSAGE_ROLE,
|
|
35
36
|
useChatContext: () => useChatContext,
|
|
36
37
|
useCopyToClipboard: () => useCopyToClipboard
|
|
37
38
|
});
|
|
@@ -39,6 +40,7 @@ module.exports = __toCommonJS(chat_exports);
|
|
|
39
40
|
|
|
40
41
|
// src/chat/chat-message-content/chat-message-content.tsx
|
|
41
42
|
var import_react_markdown = __toESM(require("react-markdown"), 1);
|
|
43
|
+
var import_remark_breaks = __toESM(require("remark-breaks"), 1);
|
|
42
44
|
var import_remark_gfm = __toESM(require("remark-gfm"), 1);
|
|
43
45
|
|
|
44
46
|
// src/chat/chat-message-content/chat-message-content-styles.ts
|
|
@@ -49,6 +51,7 @@ var colors = {
|
|
|
49
51
|
// White
|
|
50
52
|
white: "#FFFFFF",
|
|
51
53
|
"white-alpha-85": "rgba(255, 255, 255, 0.85)",
|
|
54
|
+
"white-alpha-40": "rgba(255, 255, 255, 0.40)",
|
|
52
55
|
// Brown
|
|
53
56
|
"brown-10": "#FAF9F8",
|
|
54
57
|
"brown-20": "#F5F3F0",
|
|
@@ -149,6 +152,7 @@ var typographyTypes = {
|
|
|
149
152
|
GEIST_BODY_S_REGULAR: "GEIST_BODY_S_REGULAR",
|
|
150
153
|
GEIST_BODY_S_MEDIUM: "GEIST_BODY_S_MEDIUM",
|
|
151
154
|
GEIST_BODY_S_SEMI_BOLD: "GEIST_BODY_S_SEMI_BOLD",
|
|
155
|
+
GEIST_BODY_S_BOLD: "GEIST_BODY_S_BOLD",
|
|
152
156
|
// Geist Body Medium (18px)
|
|
153
157
|
GEIST_BODY_M_LIGHT: "GEIST_BODY_M_LIGHT",
|
|
154
158
|
GEIST_BODY_M_REGULAR: "GEIST_BODY_M_REGULAR",
|
|
@@ -242,6 +246,13 @@ var typographyStyles = {
|
|
|
242
246
|
lineHeight: 24,
|
|
243
247
|
letterSpacing: -0.08
|
|
244
248
|
},
|
|
249
|
+
[typographyTypes.GEIST_BODY_S_BOLD]: {
|
|
250
|
+
fontFamily: fontFamilies.GEIST,
|
|
251
|
+
fontSize: 16,
|
|
252
|
+
fontWeight: 700,
|
|
253
|
+
lineHeight: 24,
|
|
254
|
+
letterSpacing: -0.08
|
|
255
|
+
},
|
|
245
256
|
// Geist Body Medium (18px)
|
|
246
257
|
[typographyTypes.GEIST_BODY_M_LIGHT]: {
|
|
247
258
|
fontFamily: fontFamilies.GEIST,
|
|
@@ -418,84 +429,138 @@ function typographyMixin(type) {
|
|
|
418
429
|
|
|
419
430
|
// src/chat/chat-message-content/chat-message-content-styles.ts
|
|
420
431
|
var ContentWrapper = import_styled_components.default.div`
|
|
421
|
-
${typographyMixin(typographyTypes.
|
|
432
|
+
${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};
|
|
422
433
|
color: ${colors["brown-100"]};
|
|
423
434
|
word-break: break-word;
|
|
424
435
|
|
|
425
|
-
&
|
|
426
|
-
|
|
436
|
+
& h1 {
|
|
437
|
+
${typographyMixin(typographyTypes.GEIST_HEADING_S_BOLD)};
|
|
438
|
+
margin-block: 20px;
|
|
427
439
|
}
|
|
428
440
|
|
|
429
|
-
&
|
|
430
|
-
|
|
441
|
+
& h2 {
|
|
442
|
+
${typographyMixin(typographyTypes.GEIST_BODY_L_SEMI_BOLD)};
|
|
443
|
+
margin-block: 12px;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
& h3,
|
|
447
|
+
& h4,
|
|
448
|
+
& h5,
|
|
449
|
+
& h6 {
|
|
450
|
+
${typographyMixin(typographyTypes.GEIST_BODY_M_SEMI_BOLD)};
|
|
451
|
+
margin-block: 8px;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
& strong {
|
|
455
|
+
${typographyMixin(typographyTypes.GEIST_BODY_S_SEMI_BOLD)};
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
& p {
|
|
459
|
+
margin-block: 8px;
|
|
431
460
|
}
|
|
432
461
|
|
|
433
462
|
& ul,
|
|
434
463
|
& ol {
|
|
435
|
-
margin:
|
|
464
|
+
margin-block: 16px;
|
|
436
465
|
padding-left: 20px;
|
|
437
466
|
}
|
|
438
467
|
|
|
439
|
-
&
|
|
440
|
-
|
|
441
|
-
text-decoration: underline;
|
|
468
|
+
& li + li {
|
|
469
|
+
margin-block: 4px;
|
|
442
470
|
}
|
|
443
471
|
|
|
444
|
-
&
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
border-radius: 8px;
|
|
472
|
+
& ol {
|
|
473
|
+
list-style-type: decimal;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
& ol ol {
|
|
477
|
+
list-style-type: lower-alpha;
|
|
451
478
|
}
|
|
452
479
|
|
|
453
|
-
&
|
|
454
|
-
|
|
455
|
-
background: none;
|
|
456
|
-
border-radius: 0;
|
|
480
|
+
& ol ol ol {
|
|
481
|
+
list-style-type: lower-roman;
|
|
457
482
|
}
|
|
458
483
|
|
|
459
|
-
&
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
484
|
+
& a {
|
|
485
|
+
color: inherit;
|
|
486
|
+
text-decoration-line: underline;
|
|
487
|
+
text-decoration-style: dotted;
|
|
488
|
+
text-decoration-thickness: auto;
|
|
489
|
+
text-underline-offset: auto;
|
|
490
|
+
text-underline-position: from-font;
|
|
491
|
+
transition: color 75ms ease-in-out;
|
|
492
|
+
|
|
493
|
+
&:hover {
|
|
494
|
+
color: ${colors["blue-600"]};
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
& hr {
|
|
499
|
+
border: none;
|
|
500
|
+
border-top: 1px solid ${colors["brown-40"]};
|
|
501
|
+
margin-block: 20px;
|
|
463
502
|
}
|
|
464
503
|
|
|
465
504
|
& table {
|
|
466
|
-
|
|
467
|
-
margin: 8px 0;
|
|
505
|
+
margin: 0;
|
|
468
506
|
width: 100%;
|
|
507
|
+
border-collapse: collapse;
|
|
469
508
|
}
|
|
470
509
|
|
|
471
510
|
& th,
|
|
472
511
|
& td {
|
|
473
|
-
border:
|
|
474
|
-
|
|
512
|
+
border: none;
|
|
513
|
+
border-bottom: 1px solid ${colors["brown-40"]};
|
|
475
514
|
text-align: left;
|
|
476
515
|
}
|
|
477
516
|
|
|
478
517
|
& th {
|
|
479
|
-
|
|
480
|
-
|
|
518
|
+
${typographyMixin(typographyTypes.GEIST_LABEL_CAPTION_MEDIUM)};
|
|
519
|
+
padding: 8px;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
& td {
|
|
523
|
+
${typographyMixin(typographyTypes.GEIST_BODY_XS_MEDIUM)};
|
|
524
|
+
padding: 16px 8px;
|
|
525
|
+
min-width: 150px;
|
|
526
|
+
width: 1%;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
& td strong {
|
|
530
|
+
font-weight: inherit;
|
|
531
|
+
font-size: inherit;
|
|
532
|
+
line-height: inherit;
|
|
481
533
|
}
|
|
482
534
|
|
|
483
535
|
& blockquote {
|
|
484
|
-
margin: 4px
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
536
|
+
margin-block: 4px;
|
|
537
|
+
margin-inline: 0px;
|
|
538
|
+
padding-left: 16px;
|
|
539
|
+
border-left: 4px solid ${colors["brown-40"]};
|
|
540
|
+
color: ${colors["brown-80"]};
|
|
488
541
|
}
|
|
489
542
|
`;
|
|
543
|
+
var TableScroll = import_styled_components.default.div`
|
|
544
|
+
width: 100%;
|
|
545
|
+
overflow-x: auto;
|
|
546
|
+
overflow-y: hidden;
|
|
547
|
+
margin-block: 8px 16px;
|
|
548
|
+
`;
|
|
490
549
|
|
|
491
550
|
// src/chat/chat-message-content/chat-message-content.tsx
|
|
492
551
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
552
|
+
function ScrollableTable({ node: _node, ...props }) {
|
|
553
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableScroll, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("table", { ...props }) });
|
|
554
|
+
}
|
|
555
|
+
var markdownComponents = {
|
|
556
|
+
table: ScrollableTable
|
|
557
|
+
};
|
|
493
558
|
function ChatMessageContent({ content }) {
|
|
494
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ContentWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default], children: content }) });
|
|
559
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ContentWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default, import_remark_breaks.default], components: markdownComponents, children: content }) });
|
|
495
560
|
}
|
|
496
561
|
|
|
497
562
|
// src/chat/chat-message-actions/chat-message-actions.tsx
|
|
498
|
-
var
|
|
563
|
+
var import_react5 = require("react");
|
|
499
564
|
|
|
500
565
|
// node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs
|
|
501
566
|
var import_react = require("react");
|
|
@@ -569,9 +634,6 @@ var IconThumbDown = createReactComponent("outline", "thumb-down", "ThumbDown", _
|
|
|
569
634
|
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" }]];
|
|
570
635
|
var IconThumbUp = createReactComponent("outline", "thumb-up", "ThumbUp", __iconNode4);
|
|
571
636
|
|
|
572
|
-
// src/components/icon-button/icon-button.tsx
|
|
573
|
-
var import_react3 = require("react");
|
|
574
|
-
|
|
575
637
|
// src/components/icon/icon.tsx
|
|
576
638
|
var import_react2 = require("react");
|
|
577
639
|
|
|
@@ -580,8 +642,8 @@ var import_styled_components2 = __toESM(require("styled-components"), 1);
|
|
|
580
642
|
var STROKE_WIDTH_BY_SIZE = {
|
|
581
643
|
12: 1.4,
|
|
582
644
|
14: 1.4,
|
|
583
|
-
16: 1.
|
|
584
|
-
18: 1.
|
|
645
|
+
16: 1.8,
|
|
646
|
+
18: 1.8,
|
|
585
647
|
20: 1.8,
|
|
586
648
|
24: 1.8
|
|
587
649
|
};
|
|
@@ -616,9 +678,15 @@ var Icon = (0, import_react2.forwardRef)(function Icon2({ icon: IconComponent, s
|
|
|
616
678
|
|
|
617
679
|
// src/components/icon-button/icon-button-styles.ts
|
|
618
680
|
var import_styled_components3 = __toESM(require("styled-components"), 1);
|
|
619
|
-
var
|
|
620
|
-
|
|
621
|
-
|
|
681
|
+
var PADDING = {
|
|
682
|
+
short: {
|
|
683
|
+
small: "4px",
|
|
684
|
+
medium: "6px"
|
|
685
|
+
},
|
|
686
|
+
long: {
|
|
687
|
+
small: "4px 6px",
|
|
688
|
+
medium: "6px 10px"
|
|
689
|
+
}
|
|
622
690
|
};
|
|
623
691
|
var BORDER_RADIUS = {
|
|
624
692
|
small: 6,
|
|
@@ -628,9 +696,7 @@ var Button = import_styled_components3.default.button`
|
|
|
628
696
|
display: inline-flex;
|
|
629
697
|
align-items: center;
|
|
630
698
|
justify-content: center;
|
|
631
|
-
|
|
632
|
-
height: ${({ $size }) => DIMENSIONS[$size]}px;
|
|
633
|
-
padding: 0;
|
|
699
|
+
padding: ${({ $size, $variant }) => PADDING[$variant][$size]};
|
|
634
700
|
border: none;
|
|
635
701
|
border-radius: ${({ $size }) => BORDER_RADIUS[$size]}px;
|
|
636
702
|
background: ${({ $isSelected }) => $isSelected ? colors["brown-40"] : "transparent"};
|
|
@@ -656,16 +722,29 @@ var Button = import_styled_components3.default.button`
|
|
|
656
722
|
// src/components/icon-button/icon-button.tsx
|
|
657
723
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
658
724
|
var ICON_SIZE_BY_BUTTON_SIZE = {
|
|
659
|
-
small:
|
|
660
|
-
medium:
|
|
725
|
+
small: 16,
|
|
726
|
+
medium: 20
|
|
661
727
|
};
|
|
662
|
-
|
|
728
|
+
function IconButton({
|
|
729
|
+
icon,
|
|
730
|
+
size = "small",
|
|
731
|
+
variant = "short",
|
|
732
|
+
isSelected = false,
|
|
733
|
+
disabled = false,
|
|
734
|
+
onClick,
|
|
735
|
+
className,
|
|
736
|
+
id,
|
|
737
|
+
as,
|
|
738
|
+
"aria-label": ariaLabel
|
|
739
|
+
}) {
|
|
663
740
|
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
664
741
|
Button,
|
|
665
742
|
{
|
|
666
|
-
ref,
|
|
667
743
|
className,
|
|
744
|
+
id,
|
|
745
|
+
as,
|
|
668
746
|
$size: size,
|
|
747
|
+
$variant: variant,
|
|
669
748
|
$isSelected: isSelected,
|
|
670
749
|
disabled,
|
|
671
750
|
onClick: disabled ? void 0 : onClick,
|
|
@@ -673,13 +752,13 @@ var IconButton = (0, import_react3.forwardRef)(function IconButton2({ icon, size
|
|
|
673
752
|
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon, size: ICON_SIZE_BY_BUTTON_SIZE[size] })
|
|
674
753
|
}
|
|
675
754
|
);
|
|
676
|
-
}
|
|
755
|
+
}
|
|
677
756
|
|
|
678
757
|
// src/chat/chat-context/chat-context.ts
|
|
679
|
-
var
|
|
680
|
-
var ChatContext = (0,
|
|
758
|
+
var import_react3 = require("react");
|
|
759
|
+
var ChatContext = (0, import_react3.createContext)(null);
|
|
681
760
|
function useChatContext() {
|
|
682
|
-
const context = (0,
|
|
761
|
+
const context = (0, import_react3.useContext)(ChatContext);
|
|
683
762
|
if (!context) {
|
|
684
763
|
throw new Error("useChatContext must be used within a Chat.Root component");
|
|
685
764
|
}
|
|
@@ -687,7 +766,7 @@ function useChatContext() {
|
|
|
687
766
|
}
|
|
688
767
|
|
|
689
768
|
// src/chat/hooks/use-copy-to-clipboard.ts
|
|
690
|
-
var
|
|
769
|
+
var import_react4 = require("react");
|
|
691
770
|
|
|
692
771
|
// src/utils/clipboard.ts
|
|
693
772
|
function copyToClipboard(text, options) {
|
|
@@ -697,18 +776,33 @@ function copyToClipboard(text, options) {
|
|
|
697
776
|
);
|
|
698
777
|
}
|
|
699
778
|
|
|
779
|
+
// src/utils/markdown-to-plain-text.ts
|
|
780
|
+
var PLACEHOLDER_PREFIX = "\u200B\u200BIC";
|
|
781
|
+
var PLACEHOLDER_SUFFIX = "\u200B\u200B";
|
|
782
|
+
var PLACEHOLDER_REGEX = new RegExp(`${PLACEHOLDER_PREFIX}(\\d+)${PLACEHOLDER_SUFFIX}`, "g");
|
|
783
|
+
function markdownToPlainText(markdown) {
|
|
784
|
+
if (!markdown) return "";
|
|
785
|
+
const inlineCodeSnippets = [];
|
|
786
|
+
let result = markdown.replace(/```[\s\S]*?```/g, "").replace(/`([^`]+)`/g, (_match, code) => {
|
|
787
|
+
inlineCodeSnippets.push(code);
|
|
788
|
+
return `${PLACEHOLDER_PREFIX}${inlineCodeSnippets.length - 1}${PLACEHOLDER_SUFFIX}`;
|
|
789
|
+
}).replace(/^#{1,6}\s+/gm, "").replace(/^(?:---|\*\*\*|___)\s*$/gm, "").replace(/\*{3}(.+?)\*{3}/g, "$1").replace(/\*{2}(.+?)\*{2}/g, "$1").replace(/_{2}(.+?)_{2}/g, "$1").replace(/\*(.+?)\*/g, "$1").replace(/_(.+?)_/g, "$1").replace(/~~(.+?)~~/g, "$1").replace(/!\[([^\]]*)\]\([^)]+\)/g, "$1").replace(/\[([^\]]+)\]\([^)]+\)/g, "$1").replace(/^>\s?/gm, "").replace(/^\|[-:\s|]+\|\s*$/gm, "").replace(/^\|\s?/gm, "").replace(/\s?\|$/gm, "").replace(/\n{3,}/g, "\n\n").trim();
|
|
790
|
+
result = result.replace(PLACEHOLDER_REGEX, (_match, index) => inlineCodeSnippets[Number(index)]);
|
|
791
|
+
return result;
|
|
792
|
+
}
|
|
793
|
+
|
|
700
794
|
// src/chat/hooks/use-copy-to-clipboard.ts
|
|
701
795
|
var RESET_DELAY_MS = 2e3;
|
|
702
796
|
function useCopyToClipboard() {
|
|
703
|
-
const [isCopied, setIsCopied] = (0,
|
|
704
|
-
const timeoutRef = (0,
|
|
705
|
-
(0,
|
|
797
|
+
const [isCopied, setIsCopied] = (0, import_react4.useState)(false);
|
|
798
|
+
const timeoutRef = (0, import_react4.useRef)(null);
|
|
799
|
+
(0, import_react4.useEffect)(() => {
|
|
706
800
|
return () => {
|
|
707
801
|
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
708
802
|
};
|
|
709
803
|
}, []);
|
|
710
|
-
const copy = (0,
|
|
711
|
-
copyToClipboard(text, {
|
|
804
|
+
const copy = (0, import_react4.useCallback)((text) => {
|
|
805
|
+
copyToClipboard(markdownToPlainText(text), {
|
|
712
806
|
onSuccess: () => {
|
|
713
807
|
setIsCopied(true);
|
|
714
808
|
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
@@ -722,35 +816,48 @@ function useCopyToClipboard() {
|
|
|
722
816
|
return { isCopied, copy };
|
|
723
817
|
}
|
|
724
818
|
|
|
819
|
+
// src/chat/constants.ts
|
|
820
|
+
var MESSAGE_ROLE = {
|
|
821
|
+
USER: "user",
|
|
822
|
+
ASSISTANT: "assistant"
|
|
823
|
+
};
|
|
824
|
+
|
|
725
825
|
// src/chat/chat-message-actions/chat-message-actions-styles.ts
|
|
726
826
|
var import_styled_components4 = __toESM(require("styled-components"), 1);
|
|
827
|
+
var FADE_DURATION_MS = 150;
|
|
828
|
+
var ANIMATE_DURATION_MS = 200;
|
|
727
829
|
var ActionsContainer = import_styled_components4.default.div`
|
|
728
830
|
display: flex;
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
831
|
+
opacity: ${({ $role }) => $role === MESSAGE_ROLE.ASSISTANT ? 1 : 0};
|
|
832
|
+
pointer-events: ${({ $role }) => $role === MESSAGE_ROLE.ASSISTANT ? "auto" : "none"};
|
|
833
|
+
transition: opacity ${FADE_DURATION_MS}ms ease;
|
|
834
|
+
`;
|
|
835
|
+
var AnimatedAction = import_styled_components4.default.div`
|
|
836
|
+
display: flex;
|
|
837
|
+
overflow: hidden;
|
|
838
|
+
max-width: ${({ $visible }) => $visible ? "40px" : "0"};
|
|
839
|
+
opacity: ${({ $visible }) => $visible ? 1 : 0};
|
|
840
|
+
transition: max-width ${ANIMATE_DURATION_MS}ms ease, opacity ${ANIMATE_DURATION_MS}ms ease;
|
|
734
841
|
`;
|
|
735
842
|
|
|
736
843
|
// src/chat/chat-message-actions/chat-message-actions.tsx
|
|
737
844
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
738
|
-
function ChatMessageActions({ messageId, content, role, isHelpful }) {
|
|
845
|
+
function ChatMessageActions({ className, messageId, content, role, isHelpful }) {
|
|
739
846
|
const { onCopyMessage, onThumbUpClick, onThumbDownClick } = useChatContext();
|
|
740
847
|
const { isCopied, copy } = useCopyToClipboard();
|
|
741
|
-
const handleCopy = (0,
|
|
848
|
+
const handleCopy = (0, import_react5.useCallback)(() => {
|
|
742
849
|
copy(content);
|
|
743
850
|
onCopyMessage?.(messageId);
|
|
744
851
|
}, [content, messageId, copy, onCopyMessage]);
|
|
745
|
-
const handleThumbUp = (0,
|
|
852
|
+
const handleThumbUp = (0, import_react5.useCallback)(() => {
|
|
746
853
|
onThumbUpClick?.(messageId, isHelpful === true ? null : true);
|
|
747
854
|
}, [messageId, isHelpful, onThumbUpClick]);
|
|
748
|
-
const handleThumbDown = (0,
|
|
855
|
+
const handleThumbDown = (0, import_react5.useCallback)(() => {
|
|
749
856
|
onThumbDownClick?.(messageId, isHelpful === false ? null : false);
|
|
750
857
|
}, [messageId, isHelpful, onThumbDownClick]);
|
|
751
|
-
const isAssistant = role ===
|
|
858
|
+
const isAssistant = role === MESSAGE_ROLE.ASSISTANT;
|
|
752
859
|
const hasFeedback = isAssistant && (onThumbUpClick || onThumbDownClick);
|
|
753
|
-
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(ActionsContainer, { children: [
|
|
860
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(ActionsContainer, { $role: role, className, children: [
|
|
754
861
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
755
862
|
IconButton,
|
|
756
863
|
{
|
|
@@ -759,7 +866,7 @@ function ChatMessageActions({ messageId, content, role, isHelpful }) {
|
|
|
759
866
|
"aria-label": isCopied ? "Copied" : "Copy message"
|
|
760
867
|
}
|
|
761
868
|
),
|
|
762
|
-
hasFeedback && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
869
|
+
hasFeedback && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AnimatedAction, { $visible: isHelpful !== false, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
763
870
|
IconButton,
|
|
764
871
|
{
|
|
765
872
|
icon: IconThumbUp,
|
|
@@ -767,8 +874,8 @@ function ChatMessageActions({ messageId, content, role, isHelpful }) {
|
|
|
767
874
|
isSelected: isHelpful === true,
|
|
768
875
|
"aria-label": "Good response"
|
|
769
876
|
}
|
|
770
|
-
),
|
|
771
|
-
hasFeedback && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
877
|
+
) }),
|
|
878
|
+
hasFeedback && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AnimatedAction, { $visible: isHelpful !== true, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
772
879
|
IconButton,
|
|
773
880
|
{
|
|
774
881
|
icon: IconThumbDown,
|
|
@@ -776,7 +883,7 @@ function ChatMessageActions({ messageId, content, role, isHelpful }) {
|
|
|
776
883
|
isSelected: isHelpful === false,
|
|
777
884
|
"aria-label": "Bad response"
|
|
778
885
|
}
|
|
779
|
-
)
|
|
886
|
+
) })
|
|
780
887
|
] });
|
|
781
888
|
}
|
|
782
889
|
|
|
@@ -784,25 +891,29 @@ function ChatMessageActions({ messageId, content, role, isHelpful }) {
|
|
|
784
891
|
var import_styled_components5 = __toESM(require("styled-components"), 1);
|
|
785
892
|
var MessageRow = import_styled_components5.default.div`
|
|
786
893
|
display: flex;
|
|
787
|
-
justify-content: ${({ $role }) => $role ===
|
|
788
|
-
`;
|
|
789
|
-
var MessageContainer = import_styled_components5.default.div`
|
|
790
|
-
display: flex;
|
|
791
|
-
flex-direction: column;
|
|
792
|
-
align-items: ${({ $role }) => $role === "user" ? "flex-end" : "flex-start"};
|
|
793
|
-
max-width: 90%;
|
|
894
|
+
justify-content: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "flex-end" : "flex-start"};
|
|
794
895
|
|
|
795
896
|
&:hover ${ActionsContainer} {
|
|
796
897
|
opacity: 1;
|
|
797
898
|
pointer-events: auto;
|
|
798
899
|
}
|
|
799
900
|
`;
|
|
901
|
+
var MessageContainer = import_styled_components5.default.div`
|
|
902
|
+
display: flex;
|
|
903
|
+
flex-direction: column;
|
|
904
|
+
align-items: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "flex-end" : "flex-start"};
|
|
905
|
+
max-width: 90%;
|
|
906
|
+
width: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "auto" : "100%"};
|
|
907
|
+
gap: 12px;
|
|
908
|
+
`;
|
|
800
909
|
var MessageBubble = import_styled_components5.default.div`
|
|
801
|
-
${typographyMixin(typographyTypes.
|
|
910
|
+
${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};
|
|
802
911
|
color: ${colors["brown-100"]};
|
|
803
|
-
background: ${({ $role }) => $role ===
|
|
804
|
-
padding: ${({ $role }) => $role ===
|
|
805
|
-
border-radius: ${({ $role }) => $role ===
|
|
912
|
+
background: ${({ $role }) => $role === MESSAGE_ROLE.USER ? colors.white : "transparent"};
|
|
913
|
+
padding: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "12px 16px" : "0"};
|
|
914
|
+
border-radius: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "16px" : "0"};
|
|
915
|
+
max-width: 100%;
|
|
916
|
+
min-width: 0;
|
|
806
917
|
`;
|
|
807
918
|
|
|
808
919
|
// src/chat/chat-message/chat-message.tsx
|
|
@@ -825,6 +936,7 @@ function ChatMessage({ message }) {
|
|
|
825
936
|
0 && (module.exports = {
|
|
826
937
|
ChatContext,
|
|
827
938
|
ChatMessage,
|
|
939
|
+
MESSAGE_ROLE,
|
|
828
940
|
useChatContext,
|
|
829
941
|
useCopyToClipboard
|
|
830
942
|
});
|