@shapesos/clay 0.4.1 → 0.5.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/chat.cjs +201 -85
- 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-SMTOVZ3O.js +19 -0
- package/dist/chunk-SMTOVZ3O.js.map +1 -0
- package/dist/{chunk-EPS4LOOW.js → chunk-SYMZU32H.js} +143 -63
- package/dist/chunk-SYMZU32H.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 +299 -103
- 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,142 @@ 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
|
|
|
436
|
+
& h1 {
|
|
437
|
+
${typographyMixin(typographyTypes.GEIST_HEADING_S_BOLD)};
|
|
438
|
+
margin-block: 20px;
|
|
439
|
+
}
|
|
440
|
+
|
|
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
|
+
|
|
425
458
|
& p {
|
|
426
|
-
margin:
|
|
459
|
+
margin-block: 0px;
|
|
427
460
|
}
|
|
428
461
|
|
|
429
462
|
& p + p {
|
|
430
|
-
margin-
|
|
463
|
+
margin-block: 8px 0px;
|
|
431
464
|
}
|
|
432
465
|
|
|
433
466
|
& ul,
|
|
434
467
|
& ol {
|
|
435
|
-
margin:
|
|
468
|
+
margin-block: 16px;
|
|
436
469
|
padding-left: 20px;
|
|
437
470
|
}
|
|
438
471
|
|
|
439
|
-
&
|
|
440
|
-
|
|
441
|
-
text-decoration: underline;
|
|
472
|
+
& li + li {
|
|
473
|
+
margin-block: 4px;
|
|
442
474
|
}
|
|
443
475
|
|
|
444
|
-
&
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
border-radius: 8px;
|
|
476
|
+
& ol {
|
|
477
|
+
list-style-type: decimal;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
& ol ol {
|
|
481
|
+
list-style-type: lower-alpha;
|
|
451
482
|
}
|
|
452
483
|
|
|
453
|
-
&
|
|
454
|
-
|
|
455
|
-
background: none;
|
|
456
|
-
border-radius: 0;
|
|
484
|
+
& ol ol ol {
|
|
485
|
+
list-style-type: lower-roman;
|
|
457
486
|
}
|
|
458
487
|
|
|
459
|
-
&
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
488
|
+
& a {
|
|
489
|
+
color: inherit;
|
|
490
|
+
text-decoration-line: underline;
|
|
491
|
+
text-decoration-style: dotted;
|
|
492
|
+
text-decoration-thickness: auto;
|
|
493
|
+
text-underline-offset: auto;
|
|
494
|
+
text-underline-position: from-font;
|
|
495
|
+
transition: color 75ms ease-in-out;
|
|
496
|
+
|
|
497
|
+
&:hover {
|
|
498
|
+
color: ${colors["blue-600"]};
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
& hr {
|
|
503
|
+
border: none;
|
|
504
|
+
border-top: 1px solid ${colors["brown-40"]};
|
|
505
|
+
margin-block: 20px;
|
|
463
506
|
}
|
|
464
507
|
|
|
465
508
|
& table {
|
|
466
|
-
|
|
467
|
-
margin: 8px 0;
|
|
509
|
+
margin: 0;
|
|
468
510
|
width: 100%;
|
|
511
|
+
border-collapse: collapse;
|
|
469
512
|
}
|
|
470
513
|
|
|
471
514
|
& th,
|
|
472
515
|
& td {
|
|
473
|
-
border:
|
|
474
|
-
|
|
516
|
+
border: none;
|
|
517
|
+
border-bottom: 1px solid ${colors["brown-40"]};
|
|
475
518
|
text-align: left;
|
|
476
519
|
}
|
|
477
520
|
|
|
478
521
|
& th {
|
|
479
|
-
|
|
480
|
-
|
|
522
|
+
${typographyMixin(typographyTypes.GEIST_LABEL_CAPTION_MEDIUM)};
|
|
523
|
+
padding: 8px;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
& td {
|
|
527
|
+
${typographyMixin(typographyTypes.GEIST_BODY_XS_MEDIUM)};
|
|
528
|
+
padding: 16px 8px;
|
|
529
|
+
min-width: 150px;
|
|
530
|
+
width: 1%;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
& td strong {
|
|
534
|
+
font-weight: inherit;
|
|
535
|
+
font-size: inherit;
|
|
536
|
+
line-height: inherit;
|
|
481
537
|
}
|
|
482
538
|
|
|
483
539
|
& blockquote {
|
|
484
|
-
margin: 4px
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
540
|
+
margin-block: 4px;
|
|
541
|
+
margin-inline: 0px;
|
|
542
|
+
padding-left: 16px;
|
|
543
|
+
border-left: 4px solid ${colors["brown-40"]};
|
|
544
|
+
color: ${colors["brown-80"]};
|
|
488
545
|
}
|
|
489
546
|
`;
|
|
547
|
+
var TableScroll = import_styled_components.default.div`
|
|
548
|
+
width: 100%;
|
|
549
|
+
overflow-x: auto;
|
|
550
|
+
overflow-y: hidden;
|
|
551
|
+
margin-block: 8px 16px;
|
|
552
|
+
`;
|
|
490
553
|
|
|
491
554
|
// src/chat/chat-message-content/chat-message-content.tsx
|
|
492
555
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
556
|
+
function ScrollableTable({ node: _node, ...props }) {
|
|
557
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableScroll, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("table", { ...props }) });
|
|
558
|
+
}
|
|
559
|
+
var markdownComponents = {
|
|
560
|
+
table: ScrollableTable
|
|
561
|
+
};
|
|
493
562
|
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 }) });
|
|
563
|
+
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
564
|
}
|
|
496
565
|
|
|
497
566
|
// src/chat/chat-message-actions/chat-message-actions.tsx
|
|
498
|
-
var
|
|
567
|
+
var import_react5 = require("react");
|
|
499
568
|
|
|
500
569
|
// node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs
|
|
501
570
|
var import_react = require("react");
|
|
@@ -569,9 +638,6 @@ var IconThumbDown = createReactComponent("outline", "thumb-down", "ThumbDown", _
|
|
|
569
638
|
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
639
|
var IconThumbUp = createReactComponent("outline", "thumb-up", "ThumbUp", __iconNode4);
|
|
571
640
|
|
|
572
|
-
// src/components/icon-button/icon-button.tsx
|
|
573
|
-
var import_react3 = require("react");
|
|
574
|
-
|
|
575
641
|
// src/components/icon/icon.tsx
|
|
576
642
|
var import_react2 = require("react");
|
|
577
643
|
|
|
@@ -580,8 +646,8 @@ var import_styled_components2 = __toESM(require("styled-components"), 1);
|
|
|
580
646
|
var STROKE_WIDTH_BY_SIZE = {
|
|
581
647
|
12: 1.4,
|
|
582
648
|
14: 1.4,
|
|
583
|
-
16: 1.
|
|
584
|
-
18: 1.
|
|
649
|
+
16: 1.8,
|
|
650
|
+
18: 1.8,
|
|
585
651
|
20: 1.8,
|
|
586
652
|
24: 1.8
|
|
587
653
|
};
|
|
@@ -616,9 +682,15 @@ var Icon = (0, import_react2.forwardRef)(function Icon2({ icon: IconComponent, s
|
|
|
616
682
|
|
|
617
683
|
// src/components/icon-button/icon-button-styles.ts
|
|
618
684
|
var import_styled_components3 = __toESM(require("styled-components"), 1);
|
|
619
|
-
var
|
|
620
|
-
|
|
621
|
-
|
|
685
|
+
var PADDING = {
|
|
686
|
+
short: {
|
|
687
|
+
small: "4px",
|
|
688
|
+
medium: "6px"
|
|
689
|
+
},
|
|
690
|
+
long: {
|
|
691
|
+
small: "4px 6px",
|
|
692
|
+
medium: "6px 10px"
|
|
693
|
+
}
|
|
622
694
|
};
|
|
623
695
|
var BORDER_RADIUS = {
|
|
624
696
|
small: 6,
|
|
@@ -628,9 +700,7 @@ var Button = import_styled_components3.default.button`
|
|
|
628
700
|
display: inline-flex;
|
|
629
701
|
align-items: center;
|
|
630
702
|
justify-content: center;
|
|
631
|
-
|
|
632
|
-
height: ${({ $size }) => DIMENSIONS[$size]}px;
|
|
633
|
-
padding: 0;
|
|
703
|
+
padding: ${({ $size, $variant }) => PADDING[$variant][$size]};
|
|
634
704
|
border: none;
|
|
635
705
|
border-radius: ${({ $size }) => BORDER_RADIUS[$size]}px;
|
|
636
706
|
background: ${({ $isSelected }) => $isSelected ? colors["brown-40"] : "transparent"};
|
|
@@ -656,16 +726,29 @@ var Button = import_styled_components3.default.button`
|
|
|
656
726
|
// src/components/icon-button/icon-button.tsx
|
|
657
727
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
658
728
|
var ICON_SIZE_BY_BUTTON_SIZE = {
|
|
659
|
-
small:
|
|
660
|
-
medium:
|
|
729
|
+
small: 16,
|
|
730
|
+
medium: 20
|
|
661
731
|
};
|
|
662
|
-
|
|
732
|
+
function IconButton({
|
|
733
|
+
icon,
|
|
734
|
+
size = "small",
|
|
735
|
+
variant = "short",
|
|
736
|
+
isSelected = false,
|
|
737
|
+
disabled = false,
|
|
738
|
+
onClick,
|
|
739
|
+
className,
|
|
740
|
+
id,
|
|
741
|
+
as,
|
|
742
|
+
"aria-label": ariaLabel
|
|
743
|
+
}) {
|
|
663
744
|
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
664
745
|
Button,
|
|
665
746
|
{
|
|
666
|
-
ref,
|
|
667
747
|
className,
|
|
748
|
+
id,
|
|
749
|
+
as,
|
|
668
750
|
$size: size,
|
|
751
|
+
$variant: variant,
|
|
669
752
|
$isSelected: isSelected,
|
|
670
753
|
disabled,
|
|
671
754
|
onClick: disabled ? void 0 : onClick,
|
|
@@ -673,13 +756,13 @@ var IconButton = (0, import_react3.forwardRef)(function IconButton2({ icon, size
|
|
|
673
756
|
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon, size: ICON_SIZE_BY_BUTTON_SIZE[size] })
|
|
674
757
|
}
|
|
675
758
|
);
|
|
676
|
-
}
|
|
759
|
+
}
|
|
677
760
|
|
|
678
761
|
// src/chat/chat-context/chat-context.ts
|
|
679
|
-
var
|
|
680
|
-
var ChatContext = (0,
|
|
762
|
+
var import_react3 = require("react");
|
|
763
|
+
var ChatContext = (0, import_react3.createContext)(null);
|
|
681
764
|
function useChatContext() {
|
|
682
|
-
const context = (0,
|
|
765
|
+
const context = (0, import_react3.useContext)(ChatContext);
|
|
683
766
|
if (!context) {
|
|
684
767
|
throw new Error("useChatContext must be used within a Chat.Root component");
|
|
685
768
|
}
|
|
@@ -687,7 +770,7 @@ function useChatContext() {
|
|
|
687
770
|
}
|
|
688
771
|
|
|
689
772
|
// src/chat/hooks/use-copy-to-clipboard.ts
|
|
690
|
-
var
|
|
773
|
+
var import_react4 = require("react");
|
|
691
774
|
|
|
692
775
|
// src/utils/clipboard.ts
|
|
693
776
|
function copyToClipboard(text, options) {
|
|
@@ -697,18 +780,33 @@ function copyToClipboard(text, options) {
|
|
|
697
780
|
);
|
|
698
781
|
}
|
|
699
782
|
|
|
783
|
+
// src/utils/markdown-to-plain-text.ts
|
|
784
|
+
var PLACEHOLDER_PREFIX = "\u200B\u200BIC";
|
|
785
|
+
var PLACEHOLDER_SUFFIX = "\u200B\u200B";
|
|
786
|
+
var PLACEHOLDER_REGEX = new RegExp(`${PLACEHOLDER_PREFIX}(\\d+)${PLACEHOLDER_SUFFIX}`, "g");
|
|
787
|
+
function markdownToPlainText(markdown) {
|
|
788
|
+
if (!markdown) return "";
|
|
789
|
+
const inlineCodeSnippets = [];
|
|
790
|
+
let result = markdown.replace(/```[\s\S]*?```/g, "").replace(/`([^`]+)`/g, (_match, code) => {
|
|
791
|
+
inlineCodeSnippets.push(code);
|
|
792
|
+
return `${PLACEHOLDER_PREFIX}${inlineCodeSnippets.length - 1}${PLACEHOLDER_SUFFIX}`;
|
|
793
|
+
}).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();
|
|
794
|
+
result = result.replace(PLACEHOLDER_REGEX, (_match, index) => inlineCodeSnippets[Number(index)]);
|
|
795
|
+
return result;
|
|
796
|
+
}
|
|
797
|
+
|
|
700
798
|
// src/chat/hooks/use-copy-to-clipboard.ts
|
|
701
799
|
var RESET_DELAY_MS = 2e3;
|
|
702
800
|
function useCopyToClipboard() {
|
|
703
|
-
const [isCopied, setIsCopied] = (0,
|
|
704
|
-
const timeoutRef = (0,
|
|
705
|
-
(0,
|
|
801
|
+
const [isCopied, setIsCopied] = (0, import_react4.useState)(false);
|
|
802
|
+
const timeoutRef = (0, import_react4.useRef)(null);
|
|
803
|
+
(0, import_react4.useEffect)(() => {
|
|
706
804
|
return () => {
|
|
707
805
|
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
708
806
|
};
|
|
709
807
|
}, []);
|
|
710
|
-
const copy = (0,
|
|
711
|
-
copyToClipboard(text, {
|
|
808
|
+
const copy = (0, import_react4.useCallback)((text) => {
|
|
809
|
+
copyToClipboard(markdownToPlainText(text), {
|
|
712
810
|
onSuccess: () => {
|
|
713
811
|
setIsCopied(true);
|
|
714
812
|
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
@@ -722,35 +820,48 @@ function useCopyToClipboard() {
|
|
|
722
820
|
return { isCopied, copy };
|
|
723
821
|
}
|
|
724
822
|
|
|
823
|
+
// src/chat/constants.ts
|
|
824
|
+
var MESSAGE_ROLE = {
|
|
825
|
+
USER: "user",
|
|
826
|
+
ASSISTANT: "assistant"
|
|
827
|
+
};
|
|
828
|
+
|
|
725
829
|
// src/chat/chat-message-actions/chat-message-actions-styles.ts
|
|
726
830
|
var import_styled_components4 = __toESM(require("styled-components"), 1);
|
|
831
|
+
var FADE_DURATION_MS = 150;
|
|
832
|
+
var ANIMATE_DURATION_MS = 200;
|
|
727
833
|
var ActionsContainer = import_styled_components4.default.div`
|
|
728
834
|
display: flex;
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
835
|
+
opacity: ${({ $role }) => $role === MESSAGE_ROLE.ASSISTANT ? 1 : 0};
|
|
836
|
+
pointer-events: ${({ $role }) => $role === MESSAGE_ROLE.ASSISTANT ? "auto" : "none"};
|
|
837
|
+
transition: opacity ${FADE_DURATION_MS}ms ease;
|
|
838
|
+
`;
|
|
839
|
+
var AnimatedAction = import_styled_components4.default.div`
|
|
840
|
+
display: flex;
|
|
841
|
+
overflow: hidden;
|
|
842
|
+
max-width: ${({ $visible }) => $visible ? "40px" : "0"};
|
|
843
|
+
opacity: ${({ $visible }) => $visible ? 1 : 0};
|
|
844
|
+
transition: max-width ${ANIMATE_DURATION_MS}ms ease, opacity ${ANIMATE_DURATION_MS}ms ease;
|
|
734
845
|
`;
|
|
735
846
|
|
|
736
847
|
// src/chat/chat-message-actions/chat-message-actions.tsx
|
|
737
848
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
738
|
-
function ChatMessageActions({ messageId, content, role, isHelpful }) {
|
|
849
|
+
function ChatMessageActions({ className, messageId, content, role, isHelpful }) {
|
|
739
850
|
const { onCopyMessage, onThumbUpClick, onThumbDownClick } = useChatContext();
|
|
740
851
|
const { isCopied, copy } = useCopyToClipboard();
|
|
741
|
-
const handleCopy = (0,
|
|
852
|
+
const handleCopy = (0, import_react5.useCallback)(() => {
|
|
742
853
|
copy(content);
|
|
743
854
|
onCopyMessage?.(messageId);
|
|
744
855
|
}, [content, messageId, copy, onCopyMessage]);
|
|
745
|
-
const handleThumbUp = (0,
|
|
856
|
+
const handleThumbUp = (0, import_react5.useCallback)(() => {
|
|
746
857
|
onThumbUpClick?.(messageId, isHelpful === true ? null : true);
|
|
747
858
|
}, [messageId, isHelpful, onThumbUpClick]);
|
|
748
|
-
const handleThumbDown = (0,
|
|
859
|
+
const handleThumbDown = (0, import_react5.useCallback)(() => {
|
|
749
860
|
onThumbDownClick?.(messageId, isHelpful === false ? null : false);
|
|
750
861
|
}, [messageId, isHelpful, onThumbDownClick]);
|
|
751
|
-
const isAssistant = role ===
|
|
862
|
+
const isAssistant = role === MESSAGE_ROLE.ASSISTANT;
|
|
752
863
|
const hasFeedback = isAssistant && (onThumbUpClick || onThumbDownClick);
|
|
753
|
-
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(ActionsContainer, { children: [
|
|
864
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(ActionsContainer, { $role: role, className, children: [
|
|
754
865
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
755
866
|
IconButton,
|
|
756
867
|
{
|
|
@@ -759,7 +870,7 @@ function ChatMessageActions({ messageId, content, role, isHelpful }) {
|
|
|
759
870
|
"aria-label": isCopied ? "Copied" : "Copy message"
|
|
760
871
|
}
|
|
761
872
|
),
|
|
762
|
-
hasFeedback && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
873
|
+
hasFeedback && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AnimatedAction, { $visible: isHelpful !== false, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
763
874
|
IconButton,
|
|
764
875
|
{
|
|
765
876
|
icon: IconThumbUp,
|
|
@@ -767,8 +878,8 @@ function ChatMessageActions({ messageId, content, role, isHelpful }) {
|
|
|
767
878
|
isSelected: isHelpful === true,
|
|
768
879
|
"aria-label": "Good response"
|
|
769
880
|
}
|
|
770
|
-
),
|
|
771
|
-
hasFeedback && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
881
|
+
) }),
|
|
882
|
+
hasFeedback && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AnimatedAction, { $visible: isHelpful !== true, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
772
883
|
IconButton,
|
|
773
884
|
{
|
|
774
885
|
icon: IconThumbDown,
|
|
@@ -776,7 +887,7 @@ function ChatMessageActions({ messageId, content, role, isHelpful }) {
|
|
|
776
887
|
isSelected: isHelpful === false,
|
|
777
888
|
"aria-label": "Bad response"
|
|
778
889
|
}
|
|
779
|
-
)
|
|
890
|
+
) })
|
|
780
891
|
] });
|
|
781
892
|
}
|
|
782
893
|
|
|
@@ -784,25 +895,29 @@ function ChatMessageActions({ messageId, content, role, isHelpful }) {
|
|
|
784
895
|
var import_styled_components5 = __toESM(require("styled-components"), 1);
|
|
785
896
|
var MessageRow = import_styled_components5.default.div`
|
|
786
897
|
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%;
|
|
898
|
+
justify-content: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "flex-end" : "flex-start"};
|
|
794
899
|
|
|
795
900
|
&:hover ${ActionsContainer} {
|
|
796
901
|
opacity: 1;
|
|
797
902
|
pointer-events: auto;
|
|
798
903
|
}
|
|
799
904
|
`;
|
|
905
|
+
var MessageContainer = import_styled_components5.default.div`
|
|
906
|
+
display: flex;
|
|
907
|
+
flex-direction: column;
|
|
908
|
+
align-items: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "flex-end" : "flex-start"};
|
|
909
|
+
max-width: 90%;
|
|
910
|
+
width: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "auto" : "100%"};
|
|
911
|
+
gap: 12px;
|
|
912
|
+
`;
|
|
800
913
|
var MessageBubble = import_styled_components5.default.div`
|
|
801
|
-
${typographyMixin(typographyTypes.
|
|
914
|
+
${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};
|
|
802
915
|
color: ${colors["brown-100"]};
|
|
803
|
-
background: ${({ $role }) => $role ===
|
|
804
|
-
padding: ${({ $role }) => $role ===
|
|
805
|
-
border-radius: ${({ $role }) => $role ===
|
|
916
|
+
background: ${({ $role }) => $role === MESSAGE_ROLE.USER ? colors.white : "transparent"};
|
|
917
|
+
padding: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "12px 16px" : "0"};
|
|
918
|
+
border-radius: ${({ $role }) => $role === MESSAGE_ROLE.USER ? "16px" : "0"};
|
|
919
|
+
max-width: 100%;
|
|
920
|
+
min-width: 0;
|
|
806
921
|
`;
|
|
807
922
|
|
|
808
923
|
// src/chat/chat-message/chat-message.tsx
|
|
@@ -825,6 +940,7 @@ function ChatMessage({ message }) {
|
|
|
825
940
|
0 && (module.exports = {
|
|
826
941
|
ChatContext,
|
|
827
942
|
ChatMessage,
|
|
943
|
+
MESSAGE_ROLE,
|
|
828
944
|
useChatContext,
|
|
829
945
|
useCopyToClipboard
|
|
830
946
|
});
|