@linktr.ee/messaging-react 3.1.2 → 3.1.3-rc-1780626183

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 (34) hide show
  1. package/dist/{Card-Dbz87-zR.cjs → Card-BHF-XfHG.cjs} +2 -2
  2. package/dist/{Card-Dbz87-zR.cjs.map → Card-BHF-XfHG.cjs.map} +1 -1
  3. package/dist/{Card-2Vcm5_-_.cjs → Card-CqeFyk7l.cjs} +2 -2
  4. package/dist/{Card-2Vcm5_-_.cjs.map → Card-CqeFyk7l.cjs.map} +1 -1
  5. package/dist/{Card-CScx0yAg.js → Card-Ctub3AU9.js} +2 -2
  6. package/dist/{Card-CScx0yAg.js.map → Card-Ctub3AU9.js.map} +1 -1
  7. package/dist/{Card-BUsHZ7Og.cjs → Card-DvoK42pX.cjs} +2 -2
  8. package/dist/{Card-BUsHZ7Og.cjs.map → Card-DvoK42pX.cjs.map} +1 -1
  9. package/dist/{Card-CbR6yi8j.js → Card-RHd97_iq.js} +2 -2
  10. package/dist/{Card-CbR6yi8j.js.map → Card-RHd97_iq.js.map} +1 -1
  11. package/dist/{Card-DWc7s-Ty.js → Card-VEde2Hfe.js} +3 -3
  12. package/dist/{Card-DWc7s-Ty.js.map → Card-VEde2Hfe.js.map} +1 -1
  13. package/dist/{LockedThumbnail-_OY_3HpX.js → LockedThumbnail-BADzjHNM.js} +2 -2
  14. package/dist/{LockedThumbnail-_OY_3HpX.js.map → LockedThumbnail-BADzjHNM.js.map} +1 -1
  15. package/dist/{LockedThumbnail-C-rn_o2_.cjs → LockedThumbnail-BPMP5yZP.cjs} +2 -2
  16. package/dist/{LockedThumbnail-C-rn_o2_.cjs.map → LockedThumbnail-BPMP5yZP.cjs.map} +1 -1
  17. package/dist/assets/index.css +1 -1
  18. package/dist/index-BQf4WkPC.cjs +2 -0
  19. package/dist/index-BQf4WkPC.cjs.map +1 -0
  20. package/dist/{index-Dca2QSVv.js → index-CnOvDQIp.js} +207 -217
  21. package/dist/index-CnOvDQIp.js.map +1 -0
  22. package/dist/index.cjs +1 -1
  23. package/dist/index.js +1 -1
  24. package/package.json +1 -1
  25. package/src/components/Avatar/index.tsx +1 -4
  26. package/src/components/ChannelList/CustomChannelPreview.tsx +9 -11
  27. package/src/components/ChannelView.tsx +20 -19
  28. package/src/components/CustomMessage/index.tsx +1 -1
  29. package/src/components/CustomMessageInput/index.tsx +1 -1
  30. package/src/providers/MessagingProvider.tsx +1 -1
  31. package/src/styles.css +51 -10
  32. package/dist/index-Bgbm6F_U.cjs +0 -2
  33. package/dist/index-Bgbm6F_U.cjs.map +0 -1
  34. package/dist/index-Dca2QSVv.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-Bgbm6F_U.cjs");exports.ActionButton=e.ActionButton;exports.Avatar=e.Avatar;exports.ChannelEmptyState=e.ChannelEmptyState;exports.ChannelList=e.ChannelList;exports.ChannelView=e.ChannelView;exports.CustomMessageProvider=e.CustomMessageProvider;exports.FaqList=e.FaqList;exports.FaqListItem=e.FaqListItem;exports.LinkAttachment=e.LinkAttachment;exports.LockedAttachment=e.LockedAttachment;exports.MediaMessage=e.MediaMessage;exports.MessageAttachment=e.MessageAttachment;exports.MessageVoteButtons=e.MessageVoteButtons;exports.MessagingProvider=e.MessagingProvider;exports.MessagingShell=e.MessagingShell;exports.buildCompactMetaLabel=e.buildCompactMetaLabel;exports.formatFileSize=e.formatFileSize;exports.formatRelativeTime=e.formatRelativeTime;exports.getFileExtensionLabel=e.getFileExtensionLabel;exports.getMessageDisplayText=e.getMessageDisplayText;exports.isLinkAttachment=e.isLinkAttachment;exports.isUuidLike=e.isUuidLike;exports.messageAttachmentGroupPositionFromStream=e.bubbleGroupPositionFromStream;exports.normalizeLanguageCode=e.normalizeLanguageCode;exports.resolveLinkAttachment=e.resolveLinkAttachment;exports.resolveMediaFromMessage=e.resolveMediaFromMessage;exports.resolveParticipantDisplayName=e.resolveParticipantDisplayName;exports.useCustomMessage=e.useCustomMessage;exports.useMessageVote=e.useMessageVote;exports.useMessaging=e.useMessaging;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-BQf4WkPC.cjs");exports.ActionButton=e.ActionButton;exports.Avatar=e.Avatar;exports.ChannelEmptyState=e.ChannelEmptyState;exports.ChannelList=e.ChannelList;exports.ChannelView=e.ChannelView;exports.CustomMessageProvider=e.CustomMessageProvider;exports.FaqList=e.FaqList;exports.FaqListItem=e.FaqListItem;exports.LinkAttachment=e.LinkAttachment;exports.LockedAttachment=e.LockedAttachment;exports.MediaMessage=e.MediaMessage;exports.MessageAttachment=e.MessageAttachment;exports.MessageVoteButtons=e.MessageVoteButtons;exports.MessagingProvider=e.MessagingProvider;exports.MessagingShell=e.MessagingShell;exports.buildCompactMetaLabel=e.buildCompactMetaLabel;exports.formatFileSize=e.formatFileSize;exports.formatRelativeTime=e.formatRelativeTime;exports.getFileExtensionLabel=e.getFileExtensionLabel;exports.getMessageDisplayText=e.getMessageDisplayText;exports.isLinkAttachment=e.isLinkAttachment;exports.isUuidLike=e.isUuidLike;exports.messageAttachmentGroupPositionFromStream=e.bubbleGroupPositionFromStream;exports.normalizeLanguageCode=e.normalizeLanguageCode;exports.resolveLinkAttachment=e.resolveLinkAttachment;exports.resolveMediaFromMessage=e.resolveMediaFromMessage;exports.resolveParticipantDisplayName=e.resolveParticipantDisplayName;exports.useCustomMessage=e.useCustomMessage;exports.useMessageVote=e.useMessageVote;exports.useMessaging=e.useMessaging;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { a as e, b as t, C as i, c as n, d as o, e as m, F as g, f as l, L as r, h as M, M as u, i as L, j as c, k as h, l as d, m as p, n as v, o as A, p as C, q as F, s as k, t as b, u as f, v as x, w as y, x as P, y as S, z as q, B as z, D as B } from "./index-Dca2QSVv.js";
1
+ import { a as e, b as t, C as i, c as n, d as o, e as m, F as g, f as l, L as r, h as M, M as u, i as L, j as c, k as h, l as d, m as p, n as v, o as A, p as C, q as F, s as k, t as b, u as f, v as x, w as y, x as P, y as S, z as q, B as z, D as B } from "./index-CnOvDQIp.js";
2
2
  export {
3
3
  e as ActionButton,
4
4
  t as Avatar,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linktr.ee/messaging-react",
3
- "version": "3.1.2",
3
+ "version": "3.1.3-rc-1780626183",
4
4
  "description": "React messaging components built on messaging-core for web applications",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -43,10 +43,7 @@ export const Avatar = ({
43
43
  const borderStyle =
44
44
  shape === 'circle'
45
45
  ? { borderRadius: '50%' }
46
- : {
47
- borderRadius: '33%',
48
- cornerShape: 'superellipse(1.3)',
49
- }
46
+ : { borderRadius: '1rem' }
50
47
 
51
48
  const avatarInner = (
52
49
  <div className="h-full w-full overflow-hidden" style={borderStyle}>
@@ -125,22 +125,21 @@ const CustomChannelPreview = React.memo<ChannelPreviewUIComponentProps>(
125
125
  onClick={handleClick}
126
126
  onKeyDown={handleKeyDown}
127
127
  className={classNames(
128
- 'group w-full px-4 py-3 transition-colors text-left max-w-full overflow-hidden focus-ring',
128
+ 'group w-full px-4 py-3 transition-colors text-left max-w-full overflow-hidden focus-ring rounded-[12px] [&+&]:mt-2',
129
129
  {
130
- 'bg-primary-alt/10 border-l-4 border-l-primary': isSelected,
131
- 'hover:bg-sand': !isSelected,
130
+ 'bg-black/[0.04]': isSelected,
131
+ 'hover:bg-black/[0.02]': !isSelected,
132
132
  }
133
133
  )}
134
134
  >
135
- <div className="flex items-start gap-3">
135
+ <div className="flex items-start gap-4">
136
136
  {/* Avatar */}
137
137
  <Avatar
138
138
  id={participant?.user?.id || channel.id || 'unknown'}
139
139
  name={participantName}
140
140
  image={participantImage}
141
- size={44}
141
+ size={48}
142
142
  starred={isChannelStarred}
143
- className="[&_.avatar-fallback]:group-hover:bg-[#eeeeee]"
144
143
  />
145
144
 
146
145
  {/* Content column */}
@@ -149,8 +148,7 @@ const CustomChannelPreview = React.memo<ChannelPreviewUIComponentProps>(
149
148
  <div className="flex items-center justify-between gap-2">
150
149
  <h3
151
150
  className={classNames(
152
- 'text-sm font-medium truncate',
153
- isSelected ? 'text-primary' : 'text-charcoal'
151
+ 'text-sm font-medium truncate text-[#191918]'
154
152
  )}
155
153
  >
156
154
  {isChannelStarred && (
@@ -159,7 +157,7 @@ const CustomChannelPreview = React.memo<ChannelPreviewUIComponentProps>(
159
157
  {participantName}
160
158
  </h3>
161
159
  {lastMessageTime && (
162
- <span className="text-xs text-stone flex-shrink-0">
160
+ <span className="text-xs text-[#717070] flex-shrink-0">
163
161
  {lastMessageTime}
164
162
  </span>
165
163
  )}
@@ -167,11 +165,11 @@ const CustomChannelPreview = React.memo<ChannelPreviewUIComponentProps>(
167
165
 
168
166
  {/* Message and unread badge row */}
169
167
  <div className="flex items-center justify-between gap-2 min-w-0">
170
- <p className="text-xs text-stone flex-1 line-clamp-1">
168
+ <p className="text-sm text-[#717070] flex-1 line-clamp-1">
171
169
  {messagePreview}
172
170
  </p>
173
171
  {unreadCount > 0 && (
174
- <span className="bg-[#7f22fe] text-white text-xs px-2 py-0.5 rounded-full min-w-[20px] text-center flex-shrink-0">
172
+ <span className="bg-[#7f22fe] text-white text-[10px] rounded-full h-4 flex items-center justify-center p-1 min-w-4 text-center flex-shrink-0">
175
173
  {unreadCount > 99 ? '99+' : unreadCount}
176
174
  </span>
177
175
  )}
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  ArrowLeftIcon,
3
- CaretRightIcon,
4
3
  DotsThreeIcon,
5
4
  SparkleIcon,
6
5
  StarIcon,
@@ -35,7 +34,7 @@ import { ChannelEmptyState } from './MessagingShell/ChannelEmptyState'
35
34
  import { LoadingState } from './MessagingShell/LoadingState'
36
35
 
37
36
  const ICON_BTN_CLASS =
38
- 'size-10 rounded-full bg-[#F1F0EE] hover:bg-[#E5E4E1] flex items-center justify-center transition-colors duration-150 focus-ring'
37
+ 'size-10 rounded-full hover:bg-[#E5E4E1] flex items-center justify-center transition-colors duration-150 focus-ring'
39
38
 
40
39
  const DM_AGENT_HEADER_HELPER_TEXT = 'Replies instantly with AI assistant'
41
40
 
@@ -90,13 +89,13 @@ const CustomChannelHeader: React.FC<{
90
89
 
91
90
  return (
92
91
  <div className="@container">
93
- <div className="grid grid-cols-[1fr_auto_1fr] w-full items-center @lg:hidden">
92
+ <div className="grid grid-cols-[1fr_auto_1fr] w-full items-center @lg:hidden px-6 py-3">
94
93
  <div className="flex items-center gap-2">
95
94
  {showBackButton && (
96
95
  <button
97
96
  className={classNames(
98
97
  ICON_BTN_CLASS,
99
- 'messaging-channel-view-back-button-mobile'
98
+ 'messaging-channel-view-back-button-mobile bg-[#F1F0EE]'
100
99
  )}
101
100
  onClick={onBack || (() => {})}
102
101
  type="button"
@@ -113,7 +112,7 @@ const CustomChannelHeader: React.FC<{
113
112
  image={participantImage}
114
113
  starred={showStarButton && isStarred}
115
114
  dmAgentEnabled={dmAgentEnabled}
116
- size={40}
115
+ size={48}
117
116
  />
118
117
  <p className="text-center text-xs font-medium text-black/90">
119
118
  {participantName}
@@ -145,7 +144,7 @@ const CustomChannelHeader: React.FC<{
145
144
  </button>
146
145
  )}
147
146
  <button
148
- className={ICON_BTN_CLASS}
147
+ className={classNames(ICON_BTN_CLASS, 'bg-[#F1F0EE]')}
149
148
  onClick={onShowInfo}
150
149
  type="button"
151
150
  aria-label="Show info"
@@ -154,7 +153,7 @@ const CustomChannelHeader: React.FC<{
154
153
  </button>
155
154
  </div>
156
155
  </div>
157
- <div className="hidden @lg:flex items-center justify-between gap-3 min-h-12">
156
+ <div className="px-6 py-3 hidden @lg:flex items-center justify-between gap-3 min-h-12 border-b border-b-black/[0.08]">
158
157
  <div className="flex items-center gap-4 min-w-0">
159
158
  {showBackButton && onBack && (
160
159
  <button
@@ -176,7 +175,7 @@ const CustomChannelHeader: React.FC<{
176
175
  image={participantImage}
177
176
  starred={showStarButton && isStarred}
178
177
  dmAgentEnabled={dmAgentEnabled}
179
- size={40}
178
+ size={48}
180
179
  />
181
180
  <div className="min-w-0">
182
181
  {canShowInfo ? (
@@ -187,7 +186,6 @@ const CustomChannelHeader: React.FC<{
187
186
  aria-label={`View info for ${participantName}`}
188
187
  >
189
188
  <span className="truncate">{participantName}</span>
190
- <CaretRightIcon className="size-4 shrink-0" />
191
189
  </button>
192
190
  ) : (
193
191
  <h1 className="font-medium text-black/90 truncate">
@@ -213,7 +211,7 @@ const CustomChannelHeader: React.FC<{
213
211
  }
214
212
  >
215
213
  <StarIcon
216
- className={classNames('size-5', {
214
+ className={classNames('size-6', {
217
215
  'text-yellow-600': isStarred,
218
216
  'text-black/90': !isStarred,
219
217
  })}
@@ -228,7 +226,7 @@ const CustomChannelHeader: React.FC<{
228
226
  type="button"
229
227
  aria-label="Show info"
230
228
  >
231
- <DotsThreeIcon className="size-5 text-black/90" />
229
+ <DotsThreeIcon className="size-6 text-black/90" />
232
230
  </button>
233
231
  )}
234
232
  </div>
@@ -392,7 +390,7 @@ const ChannelViewInner: React.FC<{
392
390
  >
393
391
  <Window>
394
392
  {/* Custom Channel Header */}
395
- <div key="lt-channel-header" className="p-4">
393
+ <div key="lt-channel-header">
396
394
  <CustomChannelHeader
397
395
  onBack={onBack}
398
396
  showBackButton={showBackButton}
@@ -415,10 +413,7 @@ const ChannelViewInner: React.FC<{
415
413
  key="lt-channel-message-list"
416
414
  className="flex-1 overflow-hidden relative"
417
415
  >
418
- <MessageList
419
- hideDeletedMessages
420
- hideNewMessageSeparator={false}
421
- />
416
+ <MessageList hideDeletedMessages hideNewMessageSeparator={false} />
422
417
  </div>
423
418
 
424
419
  {renderConversationFooter ? (
@@ -430,7 +425,9 @@ const ChannelViewInner: React.FC<{
430
425
  {/* Message Input */}
431
426
  <CustomMessageInput
432
427
  key="lt-channel-message-input"
433
- renderActions={() => renderMessageInputActions?.(channel)}
428
+ {...(renderMessageInputActions && {
429
+ renderActions: () => renderMessageInputActions?.(channel),
430
+ })}
434
431
  renderFooter={() => renderMessageInputFooter?.(channel)}
435
432
  disabled={composerDisabled}
436
433
  disabledReason={composerDisabledReason}
@@ -443,7 +440,9 @@ const ChannelViewInner: React.FC<{
443
440
  dialogRef={infoDialogRef}
444
441
  onClose={handleCloseInfo}
445
442
  participant={participant}
446
- participantDisplayName={resolveParticipantDisplayName(participant?.user)}
443
+ participantDisplayName={resolveParticipantDisplayName(
444
+ participant?.user
445
+ )}
447
446
  channel={channel}
448
447
  followerStatusLabel={followerStatusLabel}
449
448
  onLeaveConversation={onLeaveConversation}
@@ -582,7 +581,9 @@ export const ChannelView = React.memo<ChannelViewProps>(
582
581
  TypingIndicator={CustomTypingIndicator}
583
582
  doSendMessageRequest={doSendMessageRequest}
584
583
  {...(sendButton ? { SendButton: sendButton } : {})}
585
- {...(attachmentPreviewList ? { AttachmentPreviewList: attachmentPreviewList } : {})}
584
+ {...(attachmentPreviewList
585
+ ? { AttachmentPreviewList: attachmentPreviewList }
586
+ : {})}
586
587
  >
587
588
  <ChannelViewInner
588
589
  onBack={onBack}
@@ -207,7 +207,7 @@ const CustomMessageWithContext = (props: CustomMessageWithContextProps) => {
207
207
  id={message.user.id}
208
208
  image={message.user.image}
209
209
  name={message.user.name || message.user.id}
210
- size={isChatbot ? 24 : 28}
210
+ size={24}
211
211
  shape="circle"
212
212
  dmAgentEnabled={isChatbot}
213
213
  />
@@ -60,7 +60,7 @@ const CustomMessageInputInner: React.FC = () => {
60
60
  <div className="w-full ml-2 mr-4 self-center leading-[0]">
61
61
  <TextareaComposer
62
62
  aria-disabled={disabled || undefined}
63
- className="w-full resize-none outline-none leading-6"
63
+ className="w-full resize-none outline-none leading-5 placeholder:text-black/30 text-sm"
64
64
  // While this might usually be considered an anti-pattern, in most
65
65
  // cases, when a message thread is rendered, we want the input to
66
66
  // gain focus automatically.
@@ -340,7 +340,7 @@ export const MessagingProvider: React.FC<MessagingProviderProps> = ({
340
340
  client={client}
341
341
  customClasses={{
342
342
  channelList:
343
- 'str-chat__channel-list str-chat__channel-list-react bg-transparent lg:border-r-2 border-r-0 border-[#0000000A]',
343
+ 'str-chat__channel-list str-chat__channel-list-react bg-transparent lg:border-r-2 border-r-0 border-[#0000000A] p-4',
344
344
  }}
345
345
  >
346
346
  {children}
package/src/styles.css CHANGED
@@ -1,11 +1,18 @@
1
1
  /* Stream Chat base styles */
2
2
  @import 'stream-chat-react/dist/css/v2/index.css';
3
3
 
4
- /* Inherit the host's font instead of stream-chat-react's hardcoded system stack.
4
+ .str-chat {
5
+ /* Inherit the host's font instead of stream-chat-react's hardcoded system stack.
5
6
  In admin (federation host) this resolves to Link Sans; on linktr.ee profile
6
7
  pages it resolves to the creator's profile font. */
7
- .str-chat {
8
8
  --str-chat__font-family: inherit;
9
+
10
+ --str-chat__message-bubble-border-radius: 1.5rem;
11
+ --str-chat__message-bubble-background-color: #f1f0ee;
12
+ --str-chat__message-bubble-color: #181818;
13
+
14
+ --str-chat__own-message-bubble-background-color: #121110;
15
+ --str-chat__own-message-bubble-color: #fff;
9
16
  }
10
17
 
11
18
  /* Dialog component styles - used by messaging components */
@@ -293,21 +300,24 @@
293
300
  }
294
301
 
295
302
  .str-chat__message.str-chat__message--me {
296
- .str-chat__message-bubble {
297
- background-color: #121110;
298
- color: white;
299
- }
300
-
301
303
  .str-chat__attachment-list .str-chat__message-attachment--card {
302
304
  color: white;
303
305
  }
304
306
  }
305
307
 
306
- .str-chat__unread-messages-separator,
307
- .str-chat__date-separator-line {
308
+ .str-chat__unread-messages-separator {
308
309
  background-color: transparent;
309
310
  }
310
311
 
312
+ .str-chat__date-separator-line {
313
+ display: none;
314
+ }
315
+
316
+ .str-chat__date-separator-date {
317
+ margin: 0 auto;
318
+ font-size: 0.75rem;
319
+ }
320
+
311
321
  .str-chat__list {
312
322
  background: transparent;
313
323
  }
@@ -334,6 +344,10 @@
334
344
  justify-items: flex-start;
335
345
  }
336
346
 
347
+ .str-chat__message.str-chat__message--other {
348
+ column-gap: 0.25rem;
349
+ }
350
+
337
351
  /* Outer grid for me (outgoing) messages — add footer row after message */
338
352
  .str-chat__li .str-chat__message--me {
339
353
  grid-template-areas:
@@ -533,6 +547,18 @@
533
547
  transition-delay: 300ms;
534
548
  }
535
549
 
550
+ .str-chat__message
551
+ .str-chat__message-inner
552
+ .str-chat__message-bubble
553
+ .str-chat__message-text {
554
+ padding: 0.75rem 1rem;
555
+ }
556
+
557
+ .str-chat__message .str-chat__message-bubble {
558
+ font-size: 0.875rem;
559
+ line-height: 1.25rem;
560
+ }
561
+
536
562
  /* Chatbot reply markdown — restore semantics that consumer Tailwind preflight
537
563
  (or other resets) strip from the body of `.str-chat__message-text-inner`. */
538
564
  .str-chat__message-text-inner :where(h1, h2, h3, h4, h5, h6) {
@@ -594,7 +620,7 @@
594
620
  .str-chat__message-text
595
621
  .str-chat__message-text-inner
596
622
  p {
597
- margin: 0.25rem 0;
623
+ margin: 0;
598
624
  }
599
625
 
600
626
  .str-chat__message
@@ -637,6 +663,21 @@
637
663
  margin-bottom: 0;
638
664
  }
639
665
 
666
+ .str-chat__li--single,
667
+ .str-chat__li--bottom {
668
+ .str-chat__message {
669
+ margin-block-end: 0.875rem;
670
+ }
671
+
672
+ .str-chat__message--other .str-chat__message-bubble {
673
+ border-end-start-radius: var(--str-chat__message-bubble-border-radius);
674
+ }
675
+
676
+ .str-chat__message--me .str-chat__message-bubble {
677
+ border-end-end-radius: var(--str-chat__message-bubble-border-radius);
678
+ }
679
+ }
680
+
640
681
  /* Locked attachment wrapper: stack card + text bubble in the correct direction */
641
682
  .str-chat__li .str-chat__message--me .str-chat__message-bubble-wrapper {
642
683
  display: flex;