@ermis-network/ermis-chat-react 1.0.9 → 2.0.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 (99) hide show
  1. package/dist/index.cjs +15288 -4203
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.css +701 -195
  4. package/dist/index.css.map +1 -1
  5. package/dist/index.d.mts +862 -94
  6. package/dist/index.d.ts +862 -94
  7. package/dist/index.mjs +15238 -4179
  8. package/dist/index.mjs.map +1 -1
  9. package/package.json +9 -4
  10. package/src/channelTypeUtils.ts +1 -1
  11. package/src/components/Avatar.tsx +2 -1
  12. package/src/components/Channel.tsx +6 -2
  13. package/src/components/ChannelActions.tsx +61 -2
  14. package/src/components/ChannelHeader.tsx +19 -5
  15. package/src/components/ChannelInfo/AddMemberModal.tsx +5 -1
  16. package/src/components/ChannelInfo/ChannelInfo.tsx +330 -187
  17. package/src/components/ChannelInfo/ChannelInfoTabs.tsx +59 -297
  18. package/src/components/ChannelInfo/ChannelSettingsPanel.tsx +30 -174
  19. package/src/components/ChannelInfo/EditChannelModal.tsx +4 -1
  20. package/src/components/ChannelInfo/MediaGridItem.tsx +12 -2
  21. package/src/components/ChannelInfo/MemberListItem.tsx +2 -3
  22. package/src/components/ChannelInfo/MessageSearchPanel.tsx +27 -126
  23. package/src/components/ChannelInfo/States.tsx +1 -1
  24. package/src/components/ChannelInfo/index.ts +3 -0
  25. package/src/components/ChannelInfo/useChannelInfoTabs.tsx +386 -0
  26. package/src/components/ChannelInfo/useChannelSettings.ts +212 -0
  27. package/src/components/ChannelInfo/useMessageSearch.tsx +141 -0
  28. package/src/components/ChannelList.tsx +177 -290
  29. package/src/components/CreateChannelModal.tsx +166 -88
  30. package/src/components/Dropdown.tsx +1 -16
  31. package/src/components/EditPreview.tsx +1 -0
  32. package/src/components/ErmisCallProvider.tsx +72 -17
  33. package/src/components/ErmisCallUI.tsx +43 -20
  34. package/src/components/FlatTopicGroupItem.tsx +232 -0
  35. package/src/components/ForwardMessageModal.tsx +31 -77
  36. package/src/components/MediaLightbox.tsx +62 -40
  37. package/src/components/MentionSuggestions.tsx +47 -35
  38. package/src/components/MessageActionsBox.tsx +4 -1
  39. package/src/components/MessageInput.tsx +126 -7
  40. package/src/components/MessageInputDefaults.tsx +127 -1
  41. package/src/components/MessageItem.tsx +93 -26
  42. package/src/components/MessageQuickReactions.tsx +153 -26
  43. package/src/components/MessageReactions.tsx +2 -1
  44. package/src/components/MessageRenderers.tsx +111 -39
  45. package/src/components/Panel.tsx +1 -14
  46. package/src/components/PinnedMessages.tsx +17 -5
  47. package/src/components/PreviewOverlay.tsx +24 -0
  48. package/src/components/ReadReceipts.tsx +2 -1
  49. package/src/components/TopicList.tsx +221 -0
  50. package/src/components/TopicModal.tsx +4 -1
  51. package/src/components/TypingIndicator.tsx +14 -5
  52. package/src/components/UserPicker.tsx +87 -10
  53. package/src/components/VirtualMessageList.tsx +106 -20
  54. package/src/context/ChatComponentsContext.tsx +14 -0
  55. package/src/context/ChatProvider.tsx +18 -14
  56. package/src/context/ErmisCallContext.tsx +4 -0
  57. package/src/hooks/useChannelCapabilities.ts +7 -4
  58. package/src/hooks/useChannelData.ts +10 -3
  59. package/src/hooks/useChannelListUpdates.ts +72 -20
  60. package/src/hooks/useChannelMessages.ts +72 -10
  61. package/src/hooks/useChannelRowUpdates.ts +24 -5
  62. package/src/hooks/useChatUser.ts +31 -0
  63. package/src/hooks/useContactChannels.ts +45 -0
  64. package/src/hooks/useContactCount.ts +50 -0
  65. package/src/hooks/useDownloadHandler.ts +36 -0
  66. package/src/hooks/useDragAndDrop.ts +79 -0
  67. package/src/hooks/useForwardMessage.ts +112 -0
  68. package/src/hooks/useInviteChannels.ts +88 -0
  69. package/src/hooks/useInviteCount.ts +104 -0
  70. package/src/hooks/useMentions.ts +0 -1
  71. package/src/hooks/useMessageActions.ts +13 -10
  72. package/src/hooks/usePendingState.ts +21 -4
  73. package/src/hooks/usePreviewState.ts +69 -0
  74. package/src/hooks/useStickerPicker.ts +62 -0
  75. package/src/hooks/useTopicGroupUpdates.ts +197 -0
  76. package/src/index.ts +56 -6
  77. package/src/messageTypeUtils.ts +13 -1
  78. package/src/styles/_base.css +0 -1
  79. package/src/styles/_call-ui.css +59 -2
  80. package/src/styles/_channel-info.css +41 -4
  81. package/src/styles/_channel-list.css +97 -57
  82. package/src/styles/_create-channel-modal.css +10 -0
  83. package/src/styles/_forward-modal.css +16 -1
  84. package/src/styles/_media-lightbox.css +32 -0
  85. package/src/styles/_mentions.css +1 -1
  86. package/src/styles/_message-actions.css +3 -4
  87. package/src/styles/_message-bubble.css +286 -107
  88. package/src/styles/_message-input.css +131 -0
  89. package/src/styles/_message-list.css +33 -17
  90. package/src/styles/_message-quick-reactions.css +40 -9
  91. package/src/styles/_message-reactions.css +4 -0
  92. package/src/styles/_modal.css +2 -1
  93. package/src/styles/_preview-overlay.css +38 -0
  94. package/src/styles/_tokens.css +17 -15
  95. package/src/styles/_typing-indicator.css +7 -1
  96. package/src/styles/index.css +1 -0
  97. package/src/types.ts +362 -14
  98. package/src/utils/avatarColors.ts +48 -0
  99. package/src/utils.ts +193 -10
@@ -6,7 +6,7 @@
6
6
  padding: var(--ermis-spacing-xs) var(--ermis-spacing-sm);
7
7
  border-left: 3px solid var(--ermis-accent);
8
8
  background-color: var(--ermis-quote-other-bg);
9
- border-radius: 0 var(--ermis-radius-sm) var(--ermis-radius-sm) 0;
9
+ border-radius: var(--ermis-radius-sm);
10
10
  cursor: pointer;
11
11
  max-width: 100%;
12
12
  transition: background-color 0.15s;
@@ -17,26 +17,12 @@
17
17
  background-color: var(--ermis-quote-other-bg-hover);
18
18
  }
19
19
 
20
- .ermis-quoted-message--own {
21
- border-left-color: var(--ermis-quote-own-border);
22
- background-color: var(--ermis-quote-own-bg);
23
- border-radius: var(--ermis-radius-sm);
24
- }
25
-
26
- .ermis-quoted-message--own:hover {
27
- background-color: var(--ermis-quote-own-bg-hover);
28
- }
29
-
30
20
  .ermis-quoted-message__author {
31
21
  font-size: var(--ermis-font-size-xs);
32
22
  font-weight: 600;
33
23
  color: var(--ermis-accent);
34
24
  }
35
25
 
36
- .ermis-quoted-message--own .ermis-quoted-message__author {
37
- color: var(--ermis-quote-own-author);
38
- }
39
-
40
26
  .ermis-quoted-message__text {
41
27
  font-size: var(--ermis-font-size-xs);
42
28
  color: var(--ermis-text-muted);
@@ -45,10 +31,6 @@
45
31
  white-space: nowrap;
46
32
  }
47
33
 
48
- .ermis-quoted-message--own .ermis-quoted-message__text {
49
- color: var(--ermis-quote-own-text);
50
- }
51
-
52
34
  /* Light theme: same approach works since we darken the accent bg */
53
35
 
54
36
  /* Avatar column: fixed width for consistent alignment */
@@ -88,21 +70,28 @@
88
70
  margin-bottom: 1px;
89
71
  }
90
72
 
73
+ .ermis-message-list__item-user--clickable {
74
+ cursor: pointer;
75
+ transition: opacity 0.2s;
76
+ }
77
+
78
+ .ermis-message-list__item-user--clickable:hover {
79
+ opacity: 0.7;
80
+ }
81
+
91
82
  /* Timestamp inside bubble — bottom right */
92
83
  .ermis-message-list__item-time {
93
84
  font-size: 0.625rem;
94
85
  color: var(--ermis-text-muted);
95
- margin-left: auto;
96
- padding-left: var(--ermis-spacing-md);
86
+ margin-left: 0;
87
+ padding-top: 4px;
97
88
  white-space: nowrap;
98
89
  line-height: 1;
99
- align-self: flex-end;
100
- padding-top: 4px;
101
- width: 100%;
102
- text-align: right;
90
+ align-self: flex-start;
91
+ text-align: left;
103
92
  display: inline-flex;
104
93
  align-items: center;
105
- justify-content: flex-end;
94
+ justify-content: flex-start;
106
95
  gap: 3px;
107
96
  }
108
97
 
@@ -143,26 +132,41 @@
143
132
  }
144
133
 
145
134
  .ermis-message-bubble--own .ermis-message-list__item-time {
146
- color: rgba(255, 255, 255, 0.6);
135
+ color: var(--ermis-bubble-own-text);
136
+ opacity: 0.6;
147
137
  }
148
138
 
149
139
  .ermis-message-list__item-text {
150
140
  font-size: var(--ermis-font-size-sm);
151
141
  line-height: 1.5;
152
142
  word-break: break-word;
143
+ white-space: pre-wrap;
153
144
  }
154
145
 
155
146
  /* --- Mentions --- */
156
147
  .ermis-mention {
157
148
  color: var(--ermis-accent);
158
149
  font-weight: 600;
150
+ cursor: default;
151
+ background-color: rgba(0, 122, 255, 0.1);
152
+ padding: 2px 6px;
153
+ border-radius: 4px;
154
+ margin: 0 1px;
155
+ }
156
+
157
+ .ermis-mention--clickable {
159
158
  cursor: pointer;
159
+ transition: opacity 0.2s;
160
+ }
161
+
162
+ .ermis-mention--clickable:hover {
163
+ opacity: 0.8;
160
164
  }
161
165
 
162
166
  .ermis-message-bubble--own .ermis-mention {
163
167
  color: rgba(255, 255, 255, 0.9);
164
- text-decoration: underline;
165
- text-underline-offset: 2px;
168
+ background-color: rgba(255, 255, 255, 0.2);
169
+ text-decoration: none;
166
170
  }
167
171
 
168
172
  /* Auto-detected URLs/emails in message text */
@@ -179,53 +183,82 @@
179
183
  }
180
184
 
181
185
  .ermis-message-bubble--own .ermis-text-link {
182
- color: rgba(255, 255, 255, 0.9);
186
+ color: var(--ermis-bubble-own-text);
187
+ text-decoration: underline;
183
188
  }
184
189
 
185
190
  .ermis-message-bubble--own .ermis-attachment__link-title {
186
- color: rgba(255, 255, 255, 0.9);
191
+ color: var(--ermis-bubble-own-text);
187
192
  }
188
193
 
189
194
  /* --- Message Bubble --- */
190
195
  .ermis-message-bubble {
191
196
  position: relative;
192
197
  display: flex;
193
- flex-wrap: wrap;
194
- align-items: flex-end;
198
+ flex-direction: column;
199
+ align-items: flex-start;
195
200
  padding: var(--ermis-spacing-sm) var(--ermis-spacing-md);
196
201
  border-radius: var(--ermis-radius-lg);
197
202
  /* width: 100%; */
198
203
  word-break: break-word;
204
+ border: 1px solid var(--ermis-border);
199
205
  }
200
206
 
201
207
  .ermis-message-bubble--own {
202
208
  background-color: var(--ermis-bubble-own-bg);
203
209
  color: var(--ermis-bubble-own-text);
204
- border-bottom-right-radius: var(--ermis-radius-sm);
210
+ border-color: var(--ermis-bubble-own-bg);
205
211
  }
206
212
 
207
- /* --- Override muted text inside own bubble (unreadable on accent bg in dark mode) --- */
213
+ /* --- Override muted text inside own bubble --- */
208
214
  .ermis-message-bubble--own .ermis-attachment__file-size,
209
215
  .ermis-message-bubble--own .ermis-attachment__link-url,
210
216
  .ermis-message-bubble--own .ermis-attachment__link-description,
211
217
  .ermis-message-bubble--own .ermis-attachment__voice-duration,
212
218
  .ermis-message-bubble--own .ermis-message-list__forwarded-indicator,
213
219
  .ermis-message-bubble--own .ermis-attachment--file {
214
- color: rgba(255, 255, 255, 0.6);
220
+ color: var(--ermis-bubble-own-text);
221
+ opacity: 0.8;
215
222
  }
216
223
 
217
224
  .ermis-message-bubble--own .ermis-attachment--link-preview {
218
- border-color: rgba(255, 255, 255, 0.2);
225
+ border-color: var(--ermis-bubble-own-text);
226
+ opacity: 0.3;
219
227
  }
220
228
 
221
229
  .ermis-message-bubble--own .ermis-attachment--file {
222
- background-color: rgba(255, 255, 255, 0.1);
230
+ background-color: var(--ermis-bubble-own-text);
231
+ opacity: 0.1;
223
232
  }
224
233
 
225
234
  .ermis-message-bubble--other {
226
235
  background-color: var(--ermis-bubble-other-bg);
227
236
  color: var(--ermis-bubble-other-text);
228
- border-bottom-left-radius: var(--ermis-radius-sm);
237
+ }
238
+
239
+ /* --- Dynamic Border Radius based on grouping --- */
240
+ /* Own messages (right side flat) */
241
+ .ermis-message-list__item--own.ermis-message-list__item--group-top .ermis-message-bubble {
242
+ border-bottom-right-radius: 4px;
243
+ }
244
+ .ermis-message-list__item--own.ermis-message-list__item--group-middle .ermis-message-bubble {
245
+ border-top-right-radius: 4px;
246
+ border-bottom-right-radius: 4px;
247
+ }
248
+ .ermis-message-list__item--own.ermis-message-list__item--group-bottom .ermis-message-bubble {
249
+ border-top-right-radius: 4px;
250
+ }
251
+
252
+ /* Other messages (left side flat) */
253
+ .ermis-message-list__item--other.ermis-message-list__item--group-top .ermis-message-bubble {
254
+ border-bottom-left-radius: 4px;
255
+ }
256
+ .ermis-message-list__item--other.ermis-message-list__item--group-middle .ermis-message-bubble {
257
+ border-top-left-radius: 4px;
258
+ border-bottom-left-radius: 4px;
259
+ }
260
+ .ermis-message-list__item--other.ermis-message-list__item--group-bottom .ermis-message-bubble {
261
+ border-top-left-radius: 4px;
229
262
  }
230
263
 
231
264
  /* --- System messages --- */
@@ -254,6 +287,7 @@
254
287
  border-radius: var(--ermis-radius-md);
255
288
  background-color: var(--ermis-signal-bg);
256
289
  min-width: 180px;
290
+ position: relative;
257
291
  }
258
292
 
259
293
  .ermis-signal-message__icon {
@@ -281,6 +315,7 @@
281
315
  flex-direction: column;
282
316
  gap: 1px;
283
317
  min-width: 0;
318
+ padding-right: 40px; /* Space for timestamp */
284
319
  }
285
320
 
286
321
  .ermis-signal-message__text {
@@ -303,39 +338,21 @@
303
338
  line-height: 1.3;
304
339
  }
305
340
 
306
- /* Legacy class kept for backward compatibility */
307
- .ermis-message-list__signal-text {
308
- font-size: var(--ermis-font-size-sm);
309
- color: inherit;
310
- line-height: 1.5;
311
- word-break: break-word;
312
- }
313
-
314
- /* --- Signal message inside own bubble (accent bg) --- */
315
- .ermis-message-bubble--own .ermis-signal-message {
316
- background-color: var(--ermis-signal-own-bg);
317
- }
318
-
319
- .ermis-message-bubble--own .ermis-signal-message__icon--success {
320
- background-color: rgba(134, 239, 172, 0.2);
321
- color: var(--ermis-signal-own-success);
322
- }
323
-
324
- .ermis-message-bubble--own .ermis-signal-message__icon--missed {
325
- background-color: rgba(252, 165, 165, 0.2);
326
- color: var(--ermis-signal-own-missed);
327
- }
328
-
329
- .ermis-message-bubble--own .ermis-signal-message__text--success {
330
- color: var(--ermis-signal-own-success);
331
- }
332
-
333
- .ermis-message-bubble--own .ermis-signal-message__text--missed {
334
- color: var(--ermis-signal-own-missed);
341
+ .ermis-signal-message__time {
342
+ position: absolute;
343
+ bottom: 8px;
344
+ right: 12px;
345
+ font-size: 10px;
346
+ color: var(--ermis-text-muted);
347
+ line-height: 1;
335
348
  }
336
349
 
337
- .ermis-message-bubble--own .ermis-signal-message__duration {
338
- color: var(--ermis-signal-own-duration);
350
+ /* --- Signal Message Overrides --- */
351
+ .ermis-message-list__item--signal .ermis-message-bubble {
352
+ background: transparent !important;
353
+ box-shadow: none !important;
354
+ padding: 0 !important;
355
+ border: none !important;
339
356
  }
340
357
 
341
358
  /* --- Attachments --- */
@@ -610,57 +627,136 @@
610
627
  }
611
628
 
612
629
  .ermis-message-bubble--own .ermis-attachment__file-name {
613
- color: rgba(255, 255, 255, 0.9);
630
+ color: var(--ermis-bubble-own-text);
614
631
  }
615
632
 
616
633
  .ermis-message-bubble--own .ermis-attachment__file-icon {
617
- background: rgba(255, 255, 255, 0.2);
618
- color: #fff;
634
+ background: var(--ermis-bubble-own-text);
635
+ opacity: 0.2;
636
+ color: inherit;
619
637
  }
620
638
 
621
639
  .ermis-message-bubble--own .ermis-attachment__file-ext {
622
- color: rgba(255, 255, 255, 0.8);
640
+ color: var(--ermis-bubble-own-text);
641
+ opacity: 0.8;
623
642
  }
624
643
 
625
644
  .ermis-message-bubble--own .ermis-attachment__file-download {
626
- color: rgba(255, 255, 255, 0.7);
645
+ color: var(--ermis-bubble-own-text);
646
+ opacity: 0.8;
627
647
  }
628
648
 
629
649
  .ermis-message-bubble--own .ermis-attachment__file-download:hover {
630
- background-color: rgba(255, 255, 255, 0.15);
631
- color: #fff;
650
+ background-color: var(--ermis-bubble-own-text);
651
+ opacity: 0.15;
652
+ color: inherit;
632
653
  }
633
654
 
634
- /* --- Voice recording --- */
635
- .ermis-attachment--voice {
655
+ /* --- Custom Audio Player --- */
656
+ .ermis-custom-audio-player {
636
657
  display: flex;
637
658
  align-items: center;
638
659
  gap: var(--ermis-spacing-sm);
639
- padding: var(--ermis-spacing-sm) var(--ermis-spacing-md);
640
- border-radius: var(--ermis-radius-md);
641
- background-color: var(--ermis-bg-hover);
642
- overflow: hidden;
643
- width: 100%;
644
- box-sizing: border-box;
660
+ min-width: 240px; /* base comfortable width */
661
+ width: 100%; /* stretch to fill bubble if text makes it wider */
645
662
  }
646
663
 
647
- .ermis-attachment__voice-icon {
648
- font-size: 1.25rem;
664
+ .ermis-custom-audio-play-btn {
665
+ display: flex;
666
+ align-items: center;
667
+ justify-content: center;
668
+ width: 36px;
669
+ height: 36px;
670
+ border-radius: 50%;
671
+ background-color: var(--ermis-accent);
672
+ border: none;
673
+ cursor: pointer;
674
+ color: white; /* solid white icon */
649
675
  flex-shrink: 0;
676
+ transition: opacity 0.2s, transform 0.1s;
677
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
650
678
  }
651
679
 
652
- .ermis-attachment__voice-player {
680
+ .ermis-custom-audio-play-btn:hover {
681
+ opacity: 0.9;
682
+ }
683
+
684
+ .ermis-custom-audio-play-btn:active {
685
+ transform: scale(0.95);
686
+ }
687
+
688
+ .ermis-message-bubble--own .ermis-custom-audio-play-btn {
689
+ background-color: var(--ermis-bubble-own-text);
690
+ color: var(--ermis-accent);
691
+ }
692
+
693
+ .ermis-custom-audio-progress-container {
653
694
  flex: 1;
654
- min-width: 0;
695
+ display: flex;
696
+ align-items: center;
697
+ height: 24px;
698
+ padding: 0 6px; /* prevent thumb cutoff */
699
+ }
700
+
701
+ .ermis-custom-audio-progress-bg {
702
+ position: relative;
655
703
  width: 100%;
656
- max-width: 100%;
657
- height: 32px;
704
+ height: 4px;
705
+ background-color: rgba(0, 0, 0, 0.1);
706
+ border-radius: 2px;
707
+ cursor: pointer;
658
708
  }
659
709
 
660
- .ermis-attachment__voice-duration {
661
- font-size: var(--ermis-font-size-xs);
662
- color: var(--ermis-text-muted);
710
+ .ermis-message-bubble--own .ermis-custom-audio-progress-bg {
711
+ background-color: rgba(255, 255, 255, 0.3);
712
+ }
713
+
714
+ .ermis-custom-audio-progress-fill {
715
+ position: absolute;
716
+ top: 0;
717
+ left: 0;
718
+ height: 100%;
719
+ background-color: var(--ermis-accent);
720
+ border-radius: 2px;
721
+ pointer-events: none;
722
+ }
723
+
724
+ .ermis-message-bubble--own .ermis-custom-audio-progress-fill {
725
+ background-color: var(--ermis-bubble-own-text);
726
+ }
727
+
728
+ .ermis-custom-audio-progress-thumb {
729
+ position: absolute;
730
+ top: 50%;
731
+ width: 12px;
732
+ height: 12px;
733
+ background-color: var(--ermis-accent);
734
+ border-radius: 50%;
735
+ transform: translate(-50%, -50%);
736
+ pointer-events: none;
737
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
738
+ }
739
+
740
+ .ermis-message-bubble--own .ermis-custom-audio-progress-thumb {
741
+ background-color: var(--ermis-bubble-own-text);
742
+ }
743
+
744
+ .ermis-custom-audio-duration {
745
+ font-size: var(--ermis-font-size-sm);
746
+ color: var(--ermis-text-primary);
747
+ font-weight: 500;
663
748
  flex-shrink: 0;
749
+ min-width: 32px;
750
+ text-align: right;
751
+ opacity: 0.7;
752
+ }
753
+
754
+ .ermis-message-bubble--own .ermis-custom-audio-duration {
755
+ color: var(--ermis-bubble-own-text);
756
+ }
757
+
758
+ .ermis-custom-audio-hidden {
759
+ display: none;
664
760
  }
665
761
 
666
762
  /* --- Link preview --- */
@@ -754,9 +850,10 @@
754
850
  /* --- Sticker message --- */
755
851
  .ermis-message-sticker-wrapper {
756
852
  position: relative;
757
- width: 120px;
758
- height: 120px;
853
+ width: 160px;
854
+ height: 160px;
759
855
  overflow: hidden;
856
+ border-radius: 10px;
760
857
  }
761
858
 
762
859
  .ermis-message-sticker {
@@ -774,6 +871,42 @@
774
871
  opacity: 1;
775
872
  }
776
873
 
874
+ /* --- Sticker Message Overrides --- */
875
+ .ermis-message-list__item--sticker .ermis-message-bubble {
876
+ background: transparent !important;
877
+ box-shadow: none !important;
878
+ padding: 0 !important;
879
+ border: none !important;
880
+ position: relative;
881
+ border-radius: 0;
882
+ display: inline-block; /* Ensure bubble shrinks to fit sticker */
883
+ }
884
+
885
+ /* Timestamp overlay for stickers */
886
+ .ermis-message-list__item--sticker .ermis-message-list__item-time {
887
+ position: absolute;
888
+ bottom: 8px;
889
+ right: 8px;
890
+ color: #ffffff;
891
+ padding: 2px 8px;
892
+ border-radius: 12px;
893
+ font-size: 11px;
894
+ margin: 0;
895
+ line-height: 1.2;
896
+ font-weight: 500;
897
+ text-shadow: 0px 1px 3px rgba(0, 0, 0, 0.8), 0px 0px 1px rgba(0, 0, 0, 0.6);
898
+ }
899
+
900
+ /* Ensure edited indicator and inline status icon styling for sticker */
901
+ .ermis-message-list__item--sticker .ermis-message-list__item-time .ermis-message-list__edited-indicator {
902
+ color: rgba(255, 255, 255, 0.9);
903
+ }
904
+
905
+ .ermis-message-list__item--sticker .ermis-message-list__item-time svg {
906
+ color: #ffffff;
907
+ filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.8));
908
+ }
909
+
777
910
  /* --- Error message --- */
778
911
  .ermis-message-error {
779
912
  font-size: var(--ermis-font-size-sm);
@@ -784,11 +917,19 @@
784
917
  /* --- Read receipts --- */
785
918
  .ermis-read-receipts {
786
919
  display: flex;
787
- justify-content: flex-end;
788
920
  width: 100%;
789
921
  padding-top: 2px;
790
922
  }
791
923
 
924
+ .ermis-read-receipts--own {
925
+ justify-content: flex-end;
926
+ }
927
+
928
+ .ermis-read-receipts--other {
929
+ justify-content: flex-start;
930
+ padding-left: 36px; /* align with message content (avatar width 28px + gap 8px) */
931
+ }
932
+
792
933
  @keyframes ermis-receipt-pop {
793
934
  0% {
794
935
  opacity: 0;
@@ -807,6 +948,7 @@
807
948
  cursor: default;
808
949
  position: relative;
809
950
  animation: ermis-receipt-pop 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
951
+ z-index: 5;
810
952
  }
811
953
 
812
954
  .ermis-read-receipts__avatar {
@@ -843,10 +985,17 @@
843
985
  display: none;
844
986
  position: absolute;
845
987
  bottom: calc(100% + 6px);
846
- right: 0;
847
988
  z-index: 50;
848
989
  }
849
990
 
991
+ .ermis-read-receipts--own .ermis-read-receipts__tooltip-wrapper {
992
+ right: 0;
993
+ }
994
+
995
+ .ermis-read-receipts--other .ermis-read-receipts__tooltip-wrapper {
996
+ left: 0;
997
+ }
998
+
850
999
  /* Invisible bridge to prevent hover loss when moving mouse from avatar to tooltip */
851
1000
  .ermis-read-receipts__tooltip-wrapper::after {
852
1001
  content: '';
@@ -858,11 +1007,23 @@
858
1007
  background: transparent;
859
1008
  }
860
1009
 
1010
+ /* Inner Tooltip with scrolling and styling */
1011
+ @keyframes ermis-tooltip-fade-in {
1012
+ from {
1013
+ opacity: 0;
1014
+ transform: translateY(6px);
1015
+ }
1016
+ to {
1017
+ opacity: 1;
1018
+ transform: translateY(0);
1019
+ }
1020
+ }
1021
+
861
1022
  .ermis-read-receipts__avatars:hover .ermis-read-receipts__tooltip-wrapper {
862
1023
  display: flex;
1024
+ animation: ermis-tooltip-fade-in 0.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;
863
1025
  }
864
1026
 
865
- /* Inner Tooltip with scrolling and styling */
866
1027
  .ermis-read-receipts__tooltip {
867
1028
  display: flex;
868
1029
  flex-direction: column;
@@ -870,36 +1031,54 @@
870
1031
  background-color: var(--ermis-bg-secondary);
871
1032
  border: 1px solid var(--ermis-border);
872
1033
  border-radius: var(--ermis-radius-md, 8px);
873
- padding: var(--ermis-spacing-xs, 6px) var(--ermis-spacing-sm, 8px);
874
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
875
- width: 200px;
876
- max-height: 200px;
1034
+ padding: 8px 12px;
1035
+ box-shadow: none;
1036
+ min-width: 140px;
1037
+ width: max-content;
1038
+ max-width: 220px;
1039
+ max-height: 250px;
877
1040
  overflow-y: auto;
878
1041
  }
879
1042
 
1043
+ /* Custom scrollbar for tooltip */
1044
+ .ermis-read-receipts__tooltip::-webkit-scrollbar {
1045
+ width: 4px;
1046
+ }
1047
+ .ermis-read-receipts__tooltip::-webkit-scrollbar-track {
1048
+ background: transparent;
1049
+ }
1050
+ .ermis-read-receipts__tooltip::-webkit-scrollbar-thumb {
1051
+ background: var(--ermis-border);
1052
+ border-radius: 4px;
1053
+ }
1054
+
880
1055
  .ermis-read-receipts__tooltip-item {
881
1056
  display: flex;
882
1057
  align-items: center;
883
- gap: var(--ermis-spacing-sm, 8px);
1058
+ gap: 10px;
1059
+ padding: 2px 0;
884
1060
  }
885
1061
 
886
1062
  .ermis-read-receipts__tooltip-info {
887
1063
  display: flex;
888
1064
  flex-direction: column;
889
- gap: 1px;
1065
+ gap: 2px;
890
1066
  min-width: 0;
891
1067
  }
892
1068
 
893
1069
  .ermis-read-receipts__tooltip-name {
894
- font-size: var(--ermis-font-size-xs, 0.75rem);
1070
+ font-size: var(--ermis-font-size-sm, 0.875rem);
1071
+ font-weight: 500;
895
1072
  color: var(--ermis-text-primary);
896
1073
  white-space: nowrap;
897
1074
  overflow: hidden;
898
1075
  text-overflow: ellipsis;
1076
+ line-height: 1.2;
899
1077
  }
900
1078
 
901
1079
  .ermis-read-receipts__tooltip-time {
902
- font-size: 0.625rem;
1080
+ font-size: 0.65rem;
903
1081
  color: var(--ermis-text-muted);
904
1082
  white-space: nowrap;
1083
+ line-height: 1.2;
905
1084
  }