@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.
Files changed (65) hide show
  1. package/dist/chat.cjs +201 -85
  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-SMTOVZ3O.js +19 -0
  19. package/dist/chunk-SMTOVZ3O.js.map +1 -0
  20. package/dist/{chunk-EPS4LOOW.js → chunk-SYMZU32H.js} +143 -63
  21. package/dist/chunk-SYMZU32H.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 +299 -103
  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,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.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
 
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: 0;
459
+ margin-block: 0px;
427
460
  }
428
461
 
429
462
  & p + p {
430
- margin-top: 8px;
463
+ margin-block: 8px 0px;
431
464
  }
432
465
 
433
466
  & ul,
434
467
  & ol {
435
- margin: 4px 0;
468
+ margin-block: 16px;
436
469
  padding-left: 20px;
437
470
  }
438
471
 
439
- & a {
440
- color: ${colors["brown-100"]};
441
- text-decoration: underline;
472
+ & li + li {
473
+ margin-block: 4px;
442
474
  }
443
475
 
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;
476
+ & ol {
477
+ list-style-type: decimal;
478
+ }
479
+
480
+ & ol ol {
481
+ list-style-type: lower-alpha;
451
482
  }
452
483
 
453
- & pre code {
454
- padding: 0;
455
- background: none;
456
- border-radius: 0;
484
+ & ol ol ol {
485
+ list-style-type: lower-roman;
457
486
  }
458
487
 
459
- & code {
460
- padding: 2px 4px;
461
- background: ${colors["brown-10"]};
462
- border-radius: 4px;
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
- border-collapse: collapse;
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: 1px solid ${colors["brown-alpha-12"]};
474
- padding: 6px 12px;
516
+ border: none;
517
+ border-bottom: 1px solid ${colors["brown-40"]};
475
518
  text-align: left;
476
519
  }
477
520
 
478
521
  & th {
479
- background: ${colors["brown-10"]};
480
- font-weight: 600;
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 0;
485
- padding-left: 12px;
486
- border-left: 3px solid ${colors["brown-30"]};
487
- color: ${colors["brown-70"]};
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 import_react6 = require("react");
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.6,
584
- 18: 1.6,
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 DIMENSIONS = {
620
- small: 28,
621
- medium: 32
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
- width: ${({ $size }) => DIMENSIONS[$size]}px;
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: 14,
660
- medium: 16
729
+ small: 16,
730
+ medium: 20
661
731
  };
662
- var IconButton = (0, import_react3.forwardRef)(function IconButton2({ icon, size = "small", isSelected = false, disabled = false, onClick, className, "aria-label": ariaLabel }, ref) {
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 import_react4 = require("react");
680
- var ChatContext = (0, import_react4.createContext)(null);
762
+ var import_react3 = require("react");
763
+ var ChatContext = (0, import_react3.createContext)(null);
681
764
  function useChatContext() {
682
- const context = (0, import_react4.useContext)(ChatContext);
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 import_react5 = require("react");
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, import_react5.useState)(false);
704
- const timeoutRef = (0, import_react5.useRef)(null);
705
- (0, import_react5.useEffect)(() => {
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, import_react5.useCallback)((text) => {
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
- gap: 2px;
730
- margin-top: 4px;
731
- opacity: 0;
732
- pointer-events: none;
733
- transition: opacity 150ms ease;
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, import_react6.useCallback)(() => {
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, import_react6.useCallback)(() => {
856
+ const handleThumbUp = (0, import_react5.useCallback)(() => {
746
857
  onThumbUpClick?.(messageId, isHelpful === true ? null : true);
747
858
  }, [messageId, isHelpful, onThumbUpClick]);
748
- const handleThumbDown = (0, import_react6.useCallback)(() => {
859
+ const handleThumbDown = (0, import_react5.useCallback)(() => {
749
860
  onThumbDownClick?.(messageId, isHelpful === false ? null : false);
750
861
  }, [messageId, isHelpful, onThumbDownClick]);
751
- const isAssistant = role === "assistant";
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 === "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%;
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.GEIST_BODY_XS_MEDIUM)};
914
+ ${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};
802
915
  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"};
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
  });