message.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import * as React from 'react';
  2. import { cn } from '@/lib/utils';
  3. function MessageGroup({ className, ...props }: React.ComponentProps<'div'>) {
  4. return (
  5. <div
  6. data-slot="message-group"
  7. className={cn('gap-2 flex min-w-0 flex-col', className)}
  8. {...props}
  9. />
  10. );
  11. }
  12. function Message({
  13. className,
  14. align = 'start',
  15. ...props
  16. }: React.ComponentProps<'div'> & { align?: 'start' | 'end' }) {
  17. return (
  18. <div
  19. data-slot="message"
  20. data-align={align}
  21. className={cn(
  22. 'text-sm gap-2 group/message relative flex w-full min-w-0 data-[align=end]:flex-row-reverse',
  23. className,
  24. )}
  25. {...props}
  26. />
  27. );
  28. }
  29. function MessageAvatar({ className, ...props }: React.ComponentProps<'div'>) {
  30. return (
  31. <div
  32. data-slot="message-avatar"
  33. className={cn(
  34. 'min-w-8 group-has-data-[slot=message-footer]/message:-translate-y-8 flex w-fit shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted',
  35. className,
  36. )}
  37. {...props}
  38. />
  39. );
  40. }
  41. function MessageContent({ className, ...props }: React.ComponentProps<'div'>) {
  42. return (
  43. <div
  44. data-slot="message-content"
  45. className={cn(
  46. 'gap-2.5 group-data-[align=end]/message:*:data-slot:self-end flex w-full min-w-0 flex-col wrap-break-word',
  47. className,
  48. )}
  49. {...props}
  50. />
  51. );
  52. }
  53. function MessageHeader({ className, ...props }: React.ComponentProps<'div'>) {
  54. return (
  55. <div
  56. data-slot="message-header"
  57. className={cn(
  58. 'text-xs font-medium text-muted-foreground px-3 group-has-data-[variant=ghost]/message:px-0 flex max-w-full min-w-0 items-center',
  59. className,
  60. )}
  61. {...props}
  62. />
  63. );
  64. }
  65. function MessageFooter({ className, ...props }: React.ComponentProps<'div'>) {
  66. return (
  67. <div
  68. data-slot="message-footer"
  69. className={cn(
  70. 'text-xs font-medium text-muted-foreground px-3 group-has-data-[variant=ghost]/message:px-0 flex max-w-full min-w-0 items-center group-data-[align=end]/message:justify-end',
  71. className,
  72. )}
  73. {...props}
  74. />
  75. );
  76. }
  77. export {
  78. MessageGroup,
  79. Message,
  80. MessageAvatar,
  81. MessageContent,
  82. MessageFooter,
  83. MessageHeader,
  84. };