@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.
Files changed (65) hide show
  1. package/dist/chat.cjs +199 -87
  2. package/dist/chat.cjs.map +1 -1
  3. package/dist/chat.d.cts +6 -1
  4. package/dist/chat.d.ts +6 -1
  5. package/dist/chat.js +8 -4
  6. package/dist/chunk-DRBRT57F.js +1 -0
  7. package/dist/chunk-DRBRT57F.js.map +1 -0
  8. package/dist/chunk-JC2RQL5O.js +76 -0
  9. package/dist/chunk-JC2RQL5O.js.map +1 -0
  10. package/dist/{chunk-6HNZQ2BF.js → chunk-JF3P66JF.js} +2 -1
  11. package/dist/chunk-JF3P66JF.js.map +1 -0
  12. package/dist/chunk-K2Q5MQWJ.js +17 -0
  13. package/dist/chunk-K2Q5MQWJ.js.map +1 -0
  14. package/dist/chunk-MLCRDVQ2.js +89 -0
  15. package/dist/chunk-MLCRDVQ2.js.map +1 -0
  16. package/dist/chunk-OLJIJYB5.js +46 -0
  17. package/dist/chunk-OLJIJYB5.js.map +1 -0
  18. package/dist/{chunk-EPS4LOOW.js → chunk-PCBRMJJJ.js} +141 -65
  19. package/dist/chunk-PCBRMJJJ.js.map +1 -0
  20. package/dist/chunk-SMTOVZ3O.js +19 -0
  21. package/dist/chunk-SMTOVZ3O.js.map +1 -0
  22. package/dist/{chunk-A6DKIFWS.js → chunk-WQ2QTUYA.js} +9 -1
  23. package/dist/chunk-WQ2QTUYA.js.map +1 -0
  24. package/dist/chunk-WZHNMC6P.js +77 -0
  25. package/dist/chunk-WZHNMC6P.js.map +1 -0
  26. package/dist/icon.cjs +31 -16
  27. package/dist/icon.cjs.map +1 -1
  28. package/dist/icon.d.cts +6 -2
  29. package/dist/icon.d.ts +6 -2
  30. package/dist/icon.js +5 -3
  31. package/dist/index.cjs +297 -105
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.cts +5 -20
  34. package/dist/index.d.ts +5 -20
  35. package/dist/index.js +32 -74
  36. package/dist/index.js.map +1 -1
  37. package/dist/keyboard-shortcut.cjs +238 -0
  38. package/dist/keyboard-shortcut.cjs.map +1 -0
  39. package/dist/keyboard-shortcut.d.cts +19 -0
  40. package/dist/keyboard-shortcut.d.ts +19 -0
  41. package/dist/keyboard-shortcut.js +14 -0
  42. package/dist/keyboard-shortcut.js.map +1 -0
  43. package/dist/text-area.cjs +497 -0
  44. package/dist/text-area.cjs.map +1 -0
  45. package/dist/text-area.d.cts +18 -0
  46. package/dist/text-area.d.ts +18 -0
  47. package/dist/text-area.js +11 -0
  48. package/dist/text-area.js.map +1 -0
  49. package/dist/tokens.cjs +9 -0
  50. package/dist/tokens.cjs.map +1 -1
  51. package/dist/tokens.d.cts +2 -0
  52. package/dist/tokens.d.ts +2 -0
  53. package/dist/tokens.js +2 -2
  54. package/dist/utils.cjs +60 -0
  55. package/dist/utils.cjs.map +1 -0
  56. package/dist/utils.d.cts +7 -0
  57. package/dist/utils.d.ts +7 -0
  58. package/dist/utils.js +13 -0
  59. package/dist/utils.js.map +1 -0
  60. package/package.json +17 -1
  61. package/dist/chunk-6HNZQ2BF.js.map +0 -1
  62. package/dist/chunk-A6DKIFWS.js.map +0 -1
  63. package/dist/chunk-AEXYOY5H.js +0 -115
  64. package/dist/chunk-AEXYOY5H.js.map +0 -1
  65. 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.GEIST_BODY_XS_MEDIUM)};
432
+ ${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};
422
433
  color: ${colors["brown-100"]};
423
434
  word-break: break-word;
424
435
 
425
- & p {
426
- margin: 0;
436
+ & h1 {
437
+ ${typographyMixin(typographyTypes.GEIST_HEADING_S_BOLD)};
438
+ margin-block: 20px;
427
439
  }
428
440
 
429
- & p + p {
430
- margin-top: 8px;
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: 4px 0;
464
+ margin-block: 16px;
436
465
  padding-left: 20px;
437
466
  }
438
467
 
439
- & a {
440
- color: ${colors["brown-100"]};
441
- text-decoration: underline;
468
+ & li + li {
469
+ margin-block: 4px;
442
470
  }
443
471
 
444
- & pre {
445
- overflow-x: auto;
446
- padding: 8px;
447
- margin: 4px 0;
448
- background: ${colors["brown-10"]};
449
- border: 1px solid ${colors["brown-alpha-12"]};
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
- & pre code {
454
- padding: 0;
455
- background: none;
456
- border-radius: 0;
480
+ & ol ol ol {
481
+ list-style-type: lower-roman;
457
482
  }
458
483
 
459
- & code {
460
- padding: 2px 4px;
461
- background: ${colors["brown-10"]};
462
- border-radius: 4px;
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
- border-collapse: collapse;
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: 1px solid ${colors["brown-alpha-12"]};
474
- padding: 6px 12px;
512
+ border: none;
513
+ border-bottom: 1px solid ${colors["brown-40"]};
475
514
  text-align: left;
476
515
  }
477
516
 
478
517
  & th {
479
- background: ${colors["brown-10"]};
480
- font-weight: 600;
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 0;
485
- padding-left: 12px;
486
- border-left: 3px solid ${colors["brown-30"]};
487
- color: ${colors["brown-70"]};
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 import_react6 = require("react");
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.6,
584
- 18: 1.6,
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 DIMENSIONS = {
620
- small: 28,
621
- medium: 32
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
- width: ${({ $size }) => DIMENSIONS[$size]}px;
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: 14,
660
- medium: 16
725
+ small: 16,
726
+ medium: 20
661
727
  };
662
- var IconButton = (0, import_react3.forwardRef)(function IconButton2({ icon, size = "small", isSelected = false, disabled = false, onClick, className, "aria-label": ariaLabel }, ref) {
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 import_react4 = require("react");
680
- var ChatContext = (0, import_react4.createContext)(null);
758
+ var import_react3 = require("react");
759
+ var ChatContext = (0, import_react3.createContext)(null);
681
760
  function useChatContext() {
682
- const context = (0, import_react4.useContext)(ChatContext);
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 import_react5 = require("react");
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, import_react5.useState)(false);
704
- const timeoutRef = (0, import_react5.useRef)(null);
705
- (0, import_react5.useEffect)(() => {
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, import_react5.useCallback)((text) => {
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
- gap: 2px;
730
- margin-top: 4px;
731
- opacity: 0;
732
- pointer-events: none;
733
- transition: opacity 150ms ease;
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, import_react6.useCallback)(() => {
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, import_react6.useCallback)(() => {
852
+ const handleThumbUp = (0, import_react5.useCallback)(() => {
746
853
  onThumbUpClick?.(messageId, isHelpful === true ? null : true);
747
854
  }, [messageId, isHelpful, onThumbUpClick]);
748
- const handleThumbDown = (0, import_react6.useCallback)(() => {
855
+ const handleThumbDown = (0, import_react5.useCallback)(() => {
749
856
  onThumbDownClick?.(messageId, isHelpful === false ? null : false);
750
857
  }, [messageId, isHelpful, onThumbDownClick]);
751
- const isAssistant = role === "assistant";
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 === "user" ? "flex-end" : "flex-start"};
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.GEIST_BODY_XS_MEDIUM)};
910
+ ${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};
802
911
  color: ${colors["brown-100"]};
803
- background: ${({ $role }) => $role === "user" ? colors.white : "transparent"};
804
- padding: ${({ $role }) => $role === "user" ? "12px 16px" : "0"};
805
- border-radius: ${({ $role }) => $role === "user" ? "16px" : "0"};
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
  });