@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
package/dist/index.css CHANGED
@@ -5,6 +5,7 @@
5
5
  --ermis-bg-secondary: #111118;
6
6
  --ermis-bg-hover: rgba(255, 255, 255, 0.04);
7
7
  --ermis-bg-active: rgba(99, 102, 241, 0.12);
8
+ --ermis-bg-overlay: rgba(0, 0, 0, 0.4);
8
9
  --ermis-border: rgba(255, 255, 255, 0.08);
9
10
  --ermis-accent: #6366f1;
10
11
  --ermis-accent-hover: #818cf8;
@@ -21,11 +22,11 @@
21
22
  --ermis-bubble-other-text: var(--ermis-text-primary);
22
23
  --ermis-quote-other-bg: rgba(99, 102, 241, 0.1);
23
24
  --ermis-quote-other-bg-hover: rgba(99, 102, 241, 0.18);
24
- --ermis-quote-own-bg: rgba(99, 102, 241, 0.2);
25
- --ermis-quote-own-bg-hover: rgba(99, 102, 241, 0.3);
26
- --ermis-quote-own-border: rgba(255, 255, 255, 0.4);
27
- --ermis-quote-own-author: rgba(255, 255, 255, 0.9);
28
- --ermis-quote-own-text: rgba(255, 255, 255, 0.65);
25
+ --ermis-quote-own-bg: rgba(255, 255, 255, 0.2);
26
+ --ermis-quote-own-bg-hover: rgba(255, 255, 255, 0.3);
27
+ --ermis-quote-own-border: rgba(255, 255, 255, 0.5);
28
+ --ermis-quote-own-author: #ffffff;
29
+ --ermis-quote-own-text: rgba(255, 255, 255, 0.75);
29
30
  --ermis-font-family:
30
31
  -apple-system,
31
32
  BlinkMacSystemFont,
@@ -72,9 +73,10 @@
72
73
  --ermis-bg-secondary: #f9fafb;
73
74
  --ermis-bg-hover: rgba(0, 0, 0, 0.04);
74
75
  --ermis-bg-active: rgba(99, 102, 241, 0.08);
76
+ --ermis-bg-overlay: rgba(255, 255, 255, 0.6);
75
77
  --ermis-border: rgba(0, 0, 0, 0.08);
76
- --ermis-accent: #6366f1;
77
- --ermis-accent-hover: #4f46e5;
78
+ --ermis-accent: #3436b6;
79
+ --ermis-accent-hover: #0d00ff;
78
80
  --ermis-text-primary: #111827;
79
81
  --ermis-text-secondary: #6b7280;
80
82
  --ermis-text-muted: #9ca3af;
@@ -86,13 +88,13 @@
86
88
  --ermis-bubble-own-text: #ffffff;
87
89
  --ermis-bubble-other-bg: #f3f4f6;
88
90
  --ermis-bubble-other-text: var(--ermis-text-primary);
89
- --ermis-quote-other-bg: rgba(99, 102, 241, 0.08);
90
- --ermis-quote-other-bg-hover: rgba(99, 102, 241, 0.14);
91
- --ermis-quote-own-bg: rgba(0, 0, 0, 0.25);
92
- --ermis-quote-own-bg-hover: rgba(0, 0, 0, 0.4);
93
- --ermis-quote-own-border: rgba(255, 255, 255, 0.6);
94
- --ermis-quote-own-author: rgba(255, 255, 255, 0.95);
95
- --ermis-quote-own-text: rgba(255, 255, 255, 0.8);
91
+ --ermis-quote-other-bg: rgba(99, 102, 241, 0.06);
92
+ --ermis-quote-other-bg-hover: rgba(99, 102, 241, 0.12);
93
+ --ermis-quote-own-bg: rgba(255, 255, 255, 0.3);
94
+ --ermis-quote-own-bg-hover: rgba(255, 255, 255, 0.4);
95
+ --ermis-quote-own-border: rgba(255, 255, 255, 0.7);
96
+ --ermis-quote-own-author: #ffffff;
97
+ --ermis-quote-own-text: rgba(255, 255, 255, 0.85);
96
98
  --ermis-signal-success: #229A16;
97
99
  --ermis-signal-missed: #B72136;
98
100
  --ermis-signal-bg: rgba(0, 0, 0, 0.03);
@@ -129,11 +131,6 @@
129
131
  overflow: hidden;
130
132
  }
131
133
  .ermis-avatar--fallback {
132
- background:
133
- linear-gradient(
134
- 135deg,
135
- var(--ermis-accent) 0%,
136
- var(--ermis-accent-hover) 100%);
137
134
  color: #fff;
138
135
  font-weight: 600;
139
136
  font-family: var(--ermis-font-family);
@@ -280,8 +277,9 @@
280
277
  padding: 20px;
281
278
  display: flex;
282
279
  flex-direction: column;
283
- overflow: hidden;
280
+ overflow-y: auto;
284
281
  flex: 1;
282
+ min-height: 0;
285
283
  }
286
284
  .ermis-modal-footer {
287
285
  padding: 16px 20px;
@@ -560,7 +558,7 @@
560
558
  }
561
559
  .ermis-channel-list__pinned-icon {
562
560
  position: absolute;
563
- top: -5px;
561
+ top: 0px;
564
562
  right: 0px;
565
563
  color: var(--ermis-color-danger, #ef4444);
566
564
  display: inline-flex;
@@ -577,6 +575,10 @@
577
575
  .ermis-channel-list__item-last-message-user {
578
576
  color: var(--ermis-text-secondary);
579
577
  }
578
+ .ermis-channel-list__item-last-message-source {
579
+ color: var(--ermis-accent);
580
+ font-weight: 500;
581
+ }
580
582
  .ermis-channel-list__item-actions-wrapper,
581
583
  .ermis-channel-list__topic-actions-wrapper {
582
584
  position: absolute;
@@ -690,80 +692,111 @@
690
692
  .ermis-channel-list__accordion-icon--expanded {
691
693
  transform: rotate(0deg);
692
694
  }
693
- .ermis-channel-list__topic-group {
695
+ .ermis-channel-list__topic-hashtag {
694
696
  display: flex;
695
- flex-direction: column;
697
+ align-items: center;
698
+ justify-content: center;
699
+ width: 24px;
700
+ height: 24px;
701
+ background-color: transparent;
702
+ color: var(--ermis-text-muted);
703
+ border-radius: var(--ermis-radius-full);
704
+ font-size: 0.95rem;
705
+ font-weight: 600;
706
+ flex-shrink: 0;
696
707
  }
697
- .ermis-channel-list__topic-header {
708
+ .ermis-channel-list__topic-pills {
698
709
  display: flex;
699
710
  align-items: center;
700
- gap: var(--ermis-spacing-md);
701
- padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
702
- cursor: pointer;
703
- border-left: 2px solid transparent;
704
- transition: background-color var(--ermis-transition);
705
- position: relative;
706
- }
707
- .ermis-channel-list__topic-header:hover {
708
- background-color: var(--ermis-bg-hover);
709
- }
710
- .ermis-channel-list__topic-header-name {
711
- font-size: var(--ermis-font-size-sm);
712
- font-weight: 600;
713
- color: var(--ermis-text-primary);
714
- white-space: nowrap;
715
- overflow: hidden;
716
- text-overflow: ellipsis;
711
+ gap: var(--ermis-spacing-xs);
717
712
  flex: 1;
713
+ min-width: 0;
714
+ overflow: hidden;
715
+ }
716
+ .ermis-channel-list__topic-pill {
717
+ display: inline-flex;
718
+ align-items: center;
719
+ gap: 2px;
720
+ max-width: 80px;
721
+ flex-shrink: 0;
718
722
  }
719
- .ermis-channel-list__add-topic-btn {
723
+ .ermis-channel-list__topic-pill-avatar {
724
+ width: 16px;
725
+ height: 16px;
726
+ min-width: 16px;
720
727
  display: flex;
721
728
  align-items: center;
722
729
  justify-content: center;
723
- width: 24px;
724
- height: 24px;
725
- border-radius: var(--ermis-radius-sm);
730
+ font-size: 0.7rem;
731
+ border-radius: var(--ermis-radius-full);
726
732
  background-color: transparent;
733
+ }
734
+ .ermis-channel-list__topic-pill-name {
735
+ font-size: var(--ermis-font-size-xs);
727
736
  color: var(--ermis-text-muted);
728
- border: none;
729
- cursor: pointer;
730
- transition: all var(--ermis-transition);
737
+ white-space: nowrap;
738
+ overflow: hidden;
739
+ text-overflow: ellipsis;
740
+ max-width: 60px;
731
741
  }
732
- .ermis-channel-list__add-topic-btn:hover {
733
- background-color: var(--ermis-bg-primary);
734
- color: var(--ermis-accent);
742
+ .ermis-channel-list__topic-overflow {
743
+ font-size: var(--ermis-font-size-xs);
744
+ color: var(--ermis-text-muted);
745
+ flex-shrink: 0;
746
+ font-weight: 600;
735
747
  }
736
- .ermis-channel-list__topic-header--expanded .ermis-channel-list__accordion-icon {
737
- transform: rotate(0deg);
748
+ .ermis-channel-list__item-topics-row {
749
+ display: flex;
750
+ align-items: center;
751
+ gap: var(--ermis-spacing-xs);
752
+ margin-top: 2px;
738
753
  }
739
- .ermis-channel-list__topic-sublist {
754
+ .ermis-channel-list__error {
740
755
  display: flex;
741
756
  flex-direction: column;
742
- background-color: var(--ermis-bg-secondary);
743
- }
744
- .ermis-channel-list__topic-sublist .ermis-channel-list__item {
745
- padding-left: var(--ermis-spacing-md);
746
- margin-left: 20px;
747
- border-left: 2px solid var(--ermis-border);
757
+ align-items: center;
758
+ justify-content: center;
759
+ padding: var(--ermis-spacing-xl, 32px) var(--ermis-spacing-lg);
760
+ text-align: center;
761
+ height: 100%;
748
762
  }
749
- .ermis-channel-list__topic-sublist .ermis-channel-list__item:hover {
750
- border-left-color: var(--ermis-border-hover);
763
+ .ermis-channel-list__error-icon {
764
+ color: var(--ermis-color-danger, #ef4444);
765
+ margin-bottom: var(--ermis-spacing-md);
766
+ opacity: 0.8;
751
767
  }
752
- .ermis-channel-list__topic-sublist .ermis-channel-list__item--active {
753
- border-left-color: var(--ermis-accent);
768
+ .ermis-channel-list__error-text {
769
+ font-size: var(--ermis-font-size-sm);
770
+ color: var(--ermis-text-primary);
771
+ font-weight: 500;
772
+ margin-bottom: var(--ermis-spacing-lg);
773
+ max-width: 220px;
774
+ line-height: 1.5;
754
775
  }
755
- .ermis-channel-list__topic-hashtag {
756
- display: flex;
776
+ .ermis-channel-list__error-retry {
777
+ display: inline-flex;
757
778
  align-items: center;
758
779
  justify-content: center;
759
- width: 24px;
760
- height: 24px;
761
- background-color: transparent;
762
- color: var(--ermis-text-muted);
763
- border-radius: var(--ermis-radius-full);
764
- font-size: 0.95rem;
780
+ padding: var(--ermis-spacing-sm, 8px) var(--ermis-spacing-lg, 16px);
781
+ background-color: var(--ermis-bg-primary, #fff);
782
+ color: var(--ermis-text-primary, #111);
783
+ border: 1px solid var(--ermis-border, #e5e7eb);
784
+ border-radius: var(--ermis-radius-md, 8px);
785
+ font-size: var(--ermis-font-size-sm);
765
786
  font-weight: 600;
766
- flex-shrink: 0;
787
+ cursor: pointer;
788
+ transition: all var(--ermis-transition, 0.2s ease);
789
+ }
790
+ .ermis-channel-list__error-retry:hover {
791
+ background-color: var(--ermis-bg-hover, #f3f4f6);
792
+ border-color: var(--ermis-accent);
793
+ color: var(--ermis-accent);
794
+ }
795
+ .ermis-channel-list__error-retry svg {
796
+ transition: transform 0.5s ease;
797
+ }
798
+ .ermis-channel-list__error-retry:hover svg {
799
+ transform: rotate(180deg);
767
800
  }
768
801
 
769
802
  /* src/styles/_message-list.css */
@@ -794,8 +827,8 @@
794
827
  .ermis-message-list__vlist {
795
828
  display: flex !important;
796
829
  flex-direction: column !important;
797
- padding-left: 3rem;
798
- padding-right: 3rem;
830
+ padding-left: 1rem;
831
+ padding-right: 1rem;
799
832
  padding-top: var(--ermis-spacing-lg);
800
833
  padding-bottom: var(--ermis-spacing-lg);
801
834
  }
@@ -841,19 +874,20 @@
841
874
  .ermis-message-list__date-separator {
842
875
  display: flex;
843
876
  align-items: center;
844
- gap: var(--ermis-spacing-md);
877
+ justify-content: center;
845
878
  padding: var(--ermis-spacing-md) 0;
846
879
  margin: var(--ermis-spacing-xs) 0;
847
880
  align-self: stretch;
848
881
  }
849
882
  .ermis-message-list__date-separator-line {
850
- flex: 1;
851
- height: 1px;
852
- background-color: var(--ermis-border);
883
+ display: none;
853
884
  }
854
885
  .ermis-message-list__date-separator-label {
855
- font-size: var(--ermis-font-size-xs);
856
- color: var(--ermis-text-muted);
886
+ font-size: 11px;
887
+ color: #fff;
888
+ background-color: rgba(0, 0, 0, 0.2);
889
+ padding: 4px 12px;
890
+ border-radius: 12px;
857
891
  white-space: nowrap;
858
892
  font-weight: 500;
859
893
  }
@@ -889,10 +923,12 @@
889
923
  gap: var(--ermis-spacing-sm);
890
924
  width: 100%;
891
925
  }
892
- .ermis-message-list__item--group-start {
893
- padding-top: var(--ermis-spacing-md);
926
+ .ermis-message-list__item--group-single,
927
+ .ermis-message-list__item--group-top {
928
+ padding-top: var(--ermis-spacing-sm);
894
929
  }
895
- .ermis-message-list__item--group-cont {
930
+ .ermis-message-list__item--group-middle,
931
+ .ermis-message-list__item--group-bottom {
896
932
  padding-top: 2px;
897
933
  }
898
934
  .ermis-message-list__item--other {
@@ -943,6 +979,15 @@
943
979
  .ermis-message--error .ermis-message-bubble {
944
980
  border: 1px solid #e74c3c;
945
981
  }
982
+ .ermis-message-list__deleted-text {
983
+ display: inline-flex;
984
+ align-items: center;
985
+ gap: 6px;
986
+ font-style: italic;
987
+ font-size: var(--ermis-font-size-sm);
988
+ user-select: none;
989
+ opacity: 0.5;
990
+ }
946
991
  .ermis-message-list__pinned-indicator {
947
992
  position: absolute;
948
993
  top: -5px;
@@ -1169,7 +1214,7 @@
1169
1214
  padding: var(--ermis-spacing-xs) var(--ermis-spacing-sm);
1170
1215
  border-left: 3px solid var(--ermis-accent);
1171
1216
  background-color: var(--ermis-quote-other-bg);
1172
- border-radius: 0 var(--ermis-radius-sm) var(--ermis-radius-sm) 0;
1217
+ border-radius: var(--ermis-radius-sm);
1173
1218
  cursor: pointer;
1174
1219
  max-width: 100%;
1175
1220
  transition: background-color 0.15s;
@@ -1178,22 +1223,11 @@
1178
1223
  .ermis-quoted-message:hover {
1179
1224
  background-color: var(--ermis-quote-other-bg-hover);
1180
1225
  }
1181
- .ermis-quoted-message--own {
1182
- border-left-color: var(--ermis-quote-own-border);
1183
- background-color: var(--ermis-quote-own-bg);
1184
- border-radius: var(--ermis-radius-sm);
1185
- }
1186
- .ermis-quoted-message--own:hover {
1187
- background-color: var(--ermis-quote-own-bg-hover);
1188
- }
1189
1226
  .ermis-quoted-message__author {
1190
1227
  font-size: var(--ermis-font-size-xs);
1191
1228
  font-weight: 600;
1192
1229
  color: var(--ermis-accent);
1193
1230
  }
1194
- .ermis-quoted-message--own .ermis-quoted-message__author {
1195
- color: var(--ermis-quote-own-author);
1196
- }
1197
1231
  .ermis-quoted-message__text {
1198
1232
  font-size: var(--ermis-font-size-xs);
1199
1233
  color: var(--ermis-text-muted);
@@ -1201,9 +1235,6 @@
1201
1235
  text-overflow: ellipsis;
1202
1236
  white-space: nowrap;
1203
1237
  }
1204
- .ermis-quoted-message--own .ermis-quoted-message__text {
1205
- color: var(--ermis-quote-own-text);
1206
- }
1207
1238
  .ermis-message-list__item-avatar {
1208
1239
  flex-shrink: 0;
1209
1240
  }
@@ -1234,20 +1265,25 @@
1234
1265
  color: var(--ermis-accent);
1235
1266
  margin-bottom: 1px;
1236
1267
  }
1268
+ .ermis-message-list__item-user--clickable {
1269
+ cursor: pointer;
1270
+ transition: opacity 0.2s;
1271
+ }
1272
+ .ermis-message-list__item-user--clickable:hover {
1273
+ opacity: 0.7;
1274
+ }
1237
1275
  .ermis-message-list__item-time {
1238
1276
  font-size: 0.625rem;
1239
1277
  color: var(--ermis-text-muted);
1240
- margin-left: auto;
1241
- padding-left: var(--ermis-spacing-md);
1278
+ margin-left: 0;
1279
+ padding-top: 4px;
1242
1280
  white-space: nowrap;
1243
1281
  line-height: 1;
1244
- align-self: flex-end;
1245
- padding-top: 4px;
1246
- width: 100%;
1247
- text-align: right;
1282
+ align-self: flex-start;
1283
+ text-align: left;
1248
1284
  display: inline-flex;
1249
1285
  align-items: center;
1250
- justify-content: flex-end;
1286
+ justify-content: flex-start;
1251
1287
  gap: 3px;
1252
1288
  }
1253
1289
  .ermis-message-list__edited-indicator {
@@ -1279,22 +1315,35 @@
1279
1315
  color: var(--ermis-color-danger);
1280
1316
  }
1281
1317
  .ermis-message-bubble--own .ermis-message-list__item-time {
1282
- color: rgba(255, 255, 255, 0.6);
1318
+ color: var(--ermis-bubble-own-text);
1319
+ opacity: 0.6;
1283
1320
  }
1284
1321
  .ermis-message-list__item-text {
1285
1322
  font-size: var(--ermis-font-size-sm);
1286
1323
  line-height: 1.5;
1287
1324
  word-break: break-word;
1325
+ white-space: pre-wrap;
1288
1326
  }
1289
1327
  .ermis-mention {
1290
1328
  color: var(--ermis-accent);
1291
1329
  font-weight: 600;
1330
+ cursor: default;
1331
+ background-color: rgba(0, 122, 255, 0.1);
1332
+ padding: 2px 6px;
1333
+ border-radius: 4px;
1334
+ margin: 0 1px;
1335
+ }
1336
+ .ermis-mention--clickable {
1292
1337
  cursor: pointer;
1338
+ transition: opacity 0.2s;
1339
+ }
1340
+ .ermis-mention--clickable:hover {
1341
+ opacity: 0.8;
1293
1342
  }
1294
1343
  .ermis-message-bubble--own .ermis-mention {
1295
1344
  color: rgba(255, 255, 255, 0.9);
1296
- text-decoration: underline;
1297
- text-underline-offset: 2px;
1345
+ background-color: rgba(255, 255, 255, 0.2);
1346
+ text-decoration: none;
1298
1347
  }
1299
1348
  .ermis-text-link {
1300
1349
  color: var(--ermis-accent);
@@ -1307,24 +1356,26 @@
1307
1356
  opacity: 0.8;
1308
1357
  }
1309
1358
  .ermis-message-bubble--own .ermis-text-link {
1310
- color: rgba(255, 255, 255, 0.9);
1359
+ color: var(--ermis-bubble-own-text);
1360
+ text-decoration: underline;
1311
1361
  }
1312
1362
  .ermis-message-bubble--own .ermis-attachment__link-title {
1313
- color: rgba(255, 255, 255, 0.9);
1363
+ color: var(--ermis-bubble-own-text);
1314
1364
  }
1315
1365
  .ermis-message-bubble {
1316
1366
  position: relative;
1317
1367
  display: flex;
1318
- flex-wrap: wrap;
1319
- align-items: flex-end;
1368
+ flex-direction: column;
1369
+ align-items: flex-start;
1320
1370
  padding: var(--ermis-spacing-sm) var(--ermis-spacing-md);
1321
1371
  border-radius: var(--ermis-radius-lg);
1322
1372
  word-break: break-word;
1373
+ border: 1px solid var(--ermis-border);
1323
1374
  }
1324
1375
  .ermis-message-bubble--own {
1325
1376
  background-color: var(--ermis-bubble-own-bg);
1326
1377
  color: var(--ermis-bubble-own-text);
1327
- border-bottom-right-radius: var(--ermis-radius-sm);
1378
+ border-color: var(--ermis-bubble-own-bg);
1328
1379
  }
1329
1380
  .ermis-message-bubble--own .ermis-attachment__file-size,
1330
1381
  .ermis-message-bubble--own .ermis-attachment__link-url,
@@ -1332,18 +1383,40 @@
1332
1383
  .ermis-message-bubble--own .ermis-attachment__voice-duration,
1333
1384
  .ermis-message-bubble--own .ermis-message-list__forwarded-indicator,
1334
1385
  .ermis-message-bubble--own .ermis-attachment--file {
1335
- color: rgba(255, 255, 255, 0.6);
1386
+ color: var(--ermis-bubble-own-text);
1387
+ opacity: 0.8;
1336
1388
  }
1337
1389
  .ermis-message-bubble--own .ermis-attachment--link-preview {
1338
- border-color: rgba(255, 255, 255, 0.2);
1390
+ border-color: var(--ermis-bubble-own-text);
1391
+ opacity: 0.3;
1339
1392
  }
1340
1393
  .ermis-message-bubble--own .ermis-attachment--file {
1341
- background-color: rgba(255, 255, 255, 0.1);
1394
+ background-color: var(--ermis-bubble-own-text);
1395
+ opacity: 0.1;
1342
1396
  }
1343
1397
  .ermis-message-bubble--other {
1344
1398
  background-color: var(--ermis-bubble-other-bg);
1345
1399
  color: var(--ermis-bubble-other-text);
1346
- border-bottom-left-radius: var(--ermis-radius-sm);
1400
+ }
1401
+ .ermis-message-list__item--own.ermis-message-list__item--group-top .ermis-message-bubble {
1402
+ border-bottom-right-radius: 4px;
1403
+ }
1404
+ .ermis-message-list__item--own.ermis-message-list__item--group-middle .ermis-message-bubble {
1405
+ border-top-right-radius: 4px;
1406
+ border-bottom-right-radius: 4px;
1407
+ }
1408
+ .ermis-message-list__item--own.ermis-message-list__item--group-bottom .ermis-message-bubble {
1409
+ border-top-right-radius: 4px;
1410
+ }
1411
+ .ermis-message-list__item--other.ermis-message-list__item--group-top .ermis-message-bubble {
1412
+ border-bottom-left-radius: 4px;
1413
+ }
1414
+ .ermis-message-list__item--other.ermis-message-list__item--group-middle .ermis-message-bubble {
1415
+ border-top-left-radius: 4px;
1416
+ border-bottom-left-radius: 4px;
1417
+ }
1418
+ .ermis-message-list__item--other.ermis-message-list__item--group-bottom .ermis-message-bubble {
1419
+ border-top-left-radius: 4px;
1347
1420
  }
1348
1421
  .ermis-message-list__system {
1349
1422
  display: flex;
@@ -1367,6 +1440,7 @@
1367
1440
  border-radius: var(--ermis-radius-md);
1368
1441
  background-color: var(--ermis-signal-bg);
1369
1442
  min-width: 180px;
1443
+ position: relative;
1370
1444
  }
1371
1445
  .ermis-signal-message__icon {
1372
1446
  display: flex;
@@ -1390,6 +1464,7 @@
1390
1464
  flex-direction: column;
1391
1465
  gap: 1px;
1392
1466
  min-width: 0;
1467
+ padding-right: 40px;
1393
1468
  }
1394
1469
  .ermis-signal-message__text {
1395
1470
  font-size: var(--ermis-font-size-sm);
@@ -1407,31 +1482,19 @@
1407
1482
  color: var(--ermis-text-muted);
1408
1483
  line-height: 1.3;
1409
1484
  }
1410
- .ermis-message-list__signal-text {
1411
- font-size: var(--ermis-font-size-sm);
1412
- color: inherit;
1413
- line-height: 1.5;
1414
- word-break: break-word;
1415
- }
1416
- .ermis-message-bubble--own .ermis-signal-message {
1417
- background-color: var(--ermis-signal-own-bg);
1418
- }
1419
- .ermis-message-bubble--own .ermis-signal-message__icon--success {
1420
- background-color: rgba(134, 239, 172, 0.2);
1421
- color: var(--ermis-signal-own-success);
1422
- }
1423
- .ermis-message-bubble--own .ermis-signal-message__icon--missed {
1424
- background-color: rgba(252, 165, 165, 0.2);
1425
- color: var(--ermis-signal-own-missed);
1426
- }
1427
- .ermis-message-bubble--own .ermis-signal-message__text--success {
1428
- color: var(--ermis-signal-own-success);
1429
- }
1430
- .ermis-message-bubble--own .ermis-signal-message__text--missed {
1431
- color: var(--ermis-signal-own-missed);
1485
+ .ermis-signal-message__time {
1486
+ position: absolute;
1487
+ bottom: 8px;
1488
+ right: 12px;
1489
+ font-size: 10px;
1490
+ color: var(--ermis-text-muted);
1491
+ line-height: 1;
1432
1492
  }
1433
- .ermis-message-bubble--own .ermis-signal-message__duration {
1434
- color: var(--ermis-signal-own-duration);
1493
+ .ermis-message-list__item--signal .ermis-message-bubble {
1494
+ background: transparent !important;
1495
+ box-shadow: none !important;
1496
+ padding: 0 !important;
1497
+ border: none !important;
1435
1498
  }
1436
1499
  .ermis-message-list__item-content--has-attachments {
1437
1500
  width: 350px;
@@ -1662,48 +1725,116 @@
1662
1725
  color: var(--ermis-accent);
1663
1726
  }
1664
1727
  .ermis-message-bubble--own .ermis-attachment__file-name {
1665
- color: rgba(255, 255, 255, 0.9);
1728
+ color: var(--ermis-bubble-own-text);
1666
1729
  }
1667
1730
  .ermis-message-bubble--own .ermis-attachment__file-icon {
1668
- background: rgba(255, 255, 255, 0.2);
1669
- color: #fff;
1731
+ background: var(--ermis-bubble-own-text);
1732
+ opacity: 0.2;
1733
+ color: inherit;
1670
1734
  }
1671
1735
  .ermis-message-bubble--own .ermis-attachment__file-ext {
1672
- color: rgba(255, 255, 255, 0.8);
1736
+ color: var(--ermis-bubble-own-text);
1737
+ opacity: 0.8;
1673
1738
  }
1674
1739
  .ermis-message-bubble--own .ermis-attachment__file-download {
1675
- color: rgba(255, 255, 255, 0.7);
1740
+ color: var(--ermis-bubble-own-text);
1741
+ opacity: 0.8;
1676
1742
  }
1677
1743
  .ermis-message-bubble--own .ermis-attachment__file-download:hover {
1678
- background-color: rgba(255, 255, 255, 0.15);
1679
- color: #fff;
1744
+ background-color: var(--ermis-bubble-own-text);
1745
+ opacity: 0.15;
1746
+ color: inherit;
1680
1747
  }
1681
- .ermis-attachment--voice {
1748
+ .ermis-custom-audio-player {
1682
1749
  display: flex;
1683
1750
  align-items: center;
1684
1751
  gap: var(--ermis-spacing-sm);
1685
- padding: var(--ermis-spacing-sm) var(--ermis-spacing-md);
1686
- border-radius: var(--ermis-radius-md);
1687
- background-color: var(--ermis-bg-hover);
1688
- overflow: hidden;
1752
+ min-width: 240px;
1689
1753
  width: 100%;
1690
- box-sizing: border-box;
1691
1754
  }
1692
- .ermis-attachment__voice-icon {
1693
- font-size: 1.25rem;
1755
+ .ermis-custom-audio-play-btn {
1756
+ display: flex;
1757
+ align-items: center;
1758
+ justify-content: center;
1759
+ width: 36px;
1760
+ height: 36px;
1761
+ border-radius: 50%;
1762
+ background-color: var(--ermis-accent);
1763
+ border: none;
1764
+ cursor: pointer;
1765
+ color: white;
1694
1766
  flex-shrink: 0;
1767
+ transition: opacity 0.2s, transform 0.1s;
1768
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
1769
+ }
1770
+ .ermis-custom-audio-play-btn:hover {
1771
+ opacity: 0.9;
1772
+ }
1773
+ .ermis-custom-audio-play-btn:active {
1774
+ transform: scale(0.95);
1695
1775
  }
1696
- .ermis-attachment__voice-player {
1776
+ .ermis-message-bubble--own .ermis-custom-audio-play-btn {
1777
+ background-color: var(--ermis-bubble-own-text);
1778
+ color: var(--ermis-accent);
1779
+ }
1780
+ .ermis-custom-audio-progress-container {
1697
1781
  flex: 1;
1698
- min-width: 0;
1782
+ display: flex;
1783
+ align-items: center;
1784
+ height: 24px;
1785
+ padding: 0 6px;
1786
+ }
1787
+ .ermis-custom-audio-progress-bg {
1788
+ position: relative;
1699
1789
  width: 100%;
1700
- max-width: 100%;
1701
- height: 32px;
1790
+ height: 4px;
1791
+ background-color: rgba(0, 0, 0, 0.1);
1792
+ border-radius: 2px;
1793
+ cursor: pointer;
1702
1794
  }
1703
- .ermis-attachment__voice-duration {
1704
- font-size: var(--ermis-font-size-xs);
1705
- color: var(--ermis-text-muted);
1795
+ .ermis-message-bubble--own .ermis-custom-audio-progress-bg {
1796
+ background-color: rgba(255, 255, 255, 0.3);
1797
+ }
1798
+ .ermis-custom-audio-progress-fill {
1799
+ position: absolute;
1800
+ top: 0;
1801
+ left: 0;
1802
+ height: 100%;
1803
+ background-color: var(--ermis-accent);
1804
+ border-radius: 2px;
1805
+ pointer-events: none;
1806
+ }
1807
+ .ermis-message-bubble--own .ermis-custom-audio-progress-fill {
1808
+ background-color: var(--ermis-bubble-own-text);
1809
+ }
1810
+ .ermis-custom-audio-progress-thumb {
1811
+ position: absolute;
1812
+ top: 50%;
1813
+ width: 12px;
1814
+ height: 12px;
1815
+ background-color: var(--ermis-accent);
1816
+ border-radius: 50%;
1817
+ transform: translate(-50%, -50%);
1818
+ pointer-events: none;
1819
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
1820
+ }
1821
+ .ermis-message-bubble--own .ermis-custom-audio-progress-thumb {
1822
+ background-color: var(--ermis-bubble-own-text);
1823
+ }
1824
+ .ermis-custom-audio-duration {
1825
+ font-size: var(--ermis-font-size-sm);
1826
+ color: var(--ermis-text-primary);
1827
+ font-weight: 500;
1706
1828
  flex-shrink: 0;
1829
+ min-width: 32px;
1830
+ text-align: right;
1831
+ opacity: 0.7;
1832
+ }
1833
+ .ermis-message-bubble--own .ermis-custom-audio-duration {
1834
+ color: var(--ermis-bubble-own-text);
1835
+ }
1836
+ .ermis-custom-audio-hidden {
1837
+ display: none;
1707
1838
  }
1708
1839
  .ermis-attachment--link-preview {
1709
1840
  display: flex;
@@ -1781,9 +1912,10 @@
1781
1912
  }
1782
1913
  .ermis-message-sticker-wrapper {
1783
1914
  position: relative;
1784
- width: 120px;
1785
- height: 120px;
1915
+ width: 160px;
1916
+ height: 160px;
1786
1917
  overflow: hidden;
1918
+ border-radius: 10px;
1787
1919
  }
1788
1920
  .ermis-message-sticker {
1789
1921
  position: absolute;
@@ -1798,6 +1930,35 @@
1798
1930
  .ermis-message-sticker.ermis-attachment--loaded {
1799
1931
  opacity: 1;
1800
1932
  }
1933
+ .ermis-message-list__item--sticker .ermis-message-bubble {
1934
+ background: transparent !important;
1935
+ box-shadow: none !important;
1936
+ padding: 0 !important;
1937
+ border: none !important;
1938
+ position: relative;
1939
+ border-radius: 0;
1940
+ display: inline-block;
1941
+ }
1942
+ .ermis-message-list__item--sticker .ermis-message-list__item-time {
1943
+ position: absolute;
1944
+ bottom: 8px;
1945
+ right: 8px;
1946
+ color: #ffffff;
1947
+ padding: 2px 8px;
1948
+ border-radius: 12px;
1949
+ font-size: 11px;
1950
+ margin: 0;
1951
+ line-height: 1.2;
1952
+ font-weight: 500;
1953
+ text-shadow: 0px 1px 3px rgba(0, 0, 0, 0.8), 0px 0px 1px rgba(0, 0, 0, 0.6);
1954
+ }
1955
+ .ermis-message-list__item--sticker .ermis-message-list__item-time .ermis-message-list__edited-indicator {
1956
+ color: rgba(255, 255, 255, 0.9);
1957
+ }
1958
+ .ermis-message-list__item--sticker .ermis-message-list__item-time svg {
1959
+ color: #ffffff;
1960
+ filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.8));
1961
+ }
1801
1962
  .ermis-message-error {
1802
1963
  font-size: var(--ermis-font-size-sm);
1803
1964
  color: #ef4444;
@@ -1805,10 +1966,16 @@
1805
1966
  }
1806
1967
  .ermis-read-receipts {
1807
1968
  display: flex;
1808
- justify-content: flex-end;
1809
1969
  width: 100%;
1810
1970
  padding-top: 2px;
1811
1971
  }
1972
+ .ermis-read-receipts--own {
1973
+ justify-content: flex-end;
1974
+ }
1975
+ .ermis-read-receipts--other {
1976
+ justify-content: flex-start;
1977
+ padding-left: 36px;
1978
+ }
1812
1979
  @keyframes ermis-receipt-pop {
1813
1980
  0% {
1814
1981
  opacity: 0;
@@ -1826,6 +1993,7 @@
1826
1993
  cursor: default;
1827
1994
  position: relative;
1828
1995
  animation: ermis-receipt-pop 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
1996
+ z-index: 5;
1829
1997
  }
1830
1998
  .ermis-read-receipts__avatar {
1831
1999
  flex-shrink: 0;
@@ -1856,9 +2024,14 @@
1856
2024
  display: none;
1857
2025
  position: absolute;
1858
2026
  bottom: calc(100% + 6px);
1859
- right: 0;
1860
2027
  z-index: 50;
1861
2028
  }
2029
+ .ermis-read-receipts--own .ermis-read-receipts__tooltip-wrapper {
2030
+ right: 0;
2031
+ }
2032
+ .ermis-read-receipts--other .ermis-read-receipts__tooltip-wrapper {
2033
+ left: 0;
2034
+ }
1862
2035
  .ermis-read-receipts__tooltip-wrapper::after {
1863
2036
  content: "";
1864
2037
  position: absolute;
@@ -1868,8 +2041,19 @@
1868
2041
  height: 6px;
1869
2042
  background: transparent;
1870
2043
  }
2044
+ @keyframes ermis-tooltip-fade-in {
2045
+ from {
2046
+ opacity: 0;
2047
+ transform: translateY(6px);
2048
+ }
2049
+ to {
2050
+ opacity: 1;
2051
+ transform: translateY(0);
2052
+ }
2053
+ }
1871
2054
  .ermis-read-receipts__avatars:hover .ermis-read-receipts__tooltip-wrapper {
1872
2055
  display: flex;
2056
+ animation: ermis-tooltip-fade-in 0.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1873
2057
  }
1874
2058
  .ermis-read-receipts__tooltip {
1875
2059
  display: flex;
@@ -1878,34 +2062,50 @@
1878
2062
  background-color: var(--ermis-bg-secondary);
1879
2063
  border: 1px solid var(--ermis-border);
1880
2064
  border-radius: var(--ermis-radius-md, 8px);
1881
- padding: var(--ermis-spacing-xs, 6px) var(--ermis-spacing-sm, 8px);
1882
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
1883
- width: 200px;
1884
- max-height: 200px;
2065
+ padding: 8px 12px;
2066
+ box-shadow: none;
2067
+ min-width: 140px;
2068
+ width: max-content;
2069
+ max-width: 220px;
2070
+ max-height: 250px;
1885
2071
  overflow-y: auto;
1886
2072
  }
2073
+ .ermis-read-receipts__tooltip::-webkit-scrollbar {
2074
+ width: 4px;
2075
+ }
2076
+ .ermis-read-receipts__tooltip::-webkit-scrollbar-track {
2077
+ background: transparent;
2078
+ }
2079
+ .ermis-read-receipts__tooltip::-webkit-scrollbar-thumb {
2080
+ background: var(--ermis-border);
2081
+ border-radius: 4px;
2082
+ }
1887
2083
  .ermis-read-receipts__tooltip-item {
1888
2084
  display: flex;
1889
2085
  align-items: center;
1890
- gap: var(--ermis-spacing-sm, 8px);
2086
+ gap: 10px;
2087
+ padding: 2px 0;
1891
2088
  }
1892
2089
  .ermis-read-receipts__tooltip-info {
1893
2090
  display: flex;
1894
2091
  flex-direction: column;
1895
- gap: 1px;
2092
+ gap: 2px;
1896
2093
  min-width: 0;
1897
2094
  }
1898
2095
  .ermis-read-receipts__tooltip-name {
1899
- font-size: var(--ermis-font-size-xs, 0.75rem);
2096
+ font-size: var(--ermis-font-size-sm, 0.875rem);
2097
+ font-weight: 500;
1900
2098
  color: var(--ermis-text-primary);
1901
2099
  white-space: nowrap;
1902
2100
  overflow: hidden;
1903
2101
  text-overflow: ellipsis;
2102
+ line-height: 1.2;
1904
2103
  }
1905
2104
  .ermis-read-receipts__tooltip-time {
1906
- font-size: 0.625rem;
2105
+ font-size: 0.65rem;
1907
2106
  color: var(--ermis-text-muted);
1908
2107
  white-space: nowrap;
2108
+ line-height: 1.2;
1909
2109
  }
1910
2110
 
1911
2111
  /* src/styles/_message-input.css */
@@ -1918,6 +2118,7 @@
1918
2118
  background-color: var(--ermis-bg-secondary);
1919
2119
  font-family: var(--ermis-font-family);
1920
2120
  position: relative;
2121
+ overflow: hidden;
1921
2122
  }
1922
2123
  .ermis-message-input__row {
1923
2124
  display: flex;
@@ -2009,6 +2210,52 @@
2009
2210
  .ermis-message-input__emoji-btn--active {
2010
2211
  color: var(--ermis-accent);
2011
2212
  }
2213
+ .ermis-message-input__voice-btn {
2214
+ display: inline-flex;
2215
+ align-items: center;
2216
+ justify-content: center;
2217
+ padding: 4px;
2218
+ border: none;
2219
+ background: none;
2220
+ font-size: 1.25rem;
2221
+ cursor: pointer;
2222
+ color: var(--ermis-text-secondary);
2223
+ transition: color var(--ermis-transition);
2224
+ flex-shrink: 0;
2225
+ }
2226
+ .ermis-message-input__voice-btn:hover {
2227
+ color: var(--ermis-accent);
2228
+ }
2229
+ .ermis-message-input__voice-btn--recording {
2230
+ color: var(--ermis-color-danger);
2231
+ }
2232
+ .ermis-message-input__voice-btn:disabled {
2233
+ opacity: 0.4;
2234
+ cursor: not-allowed;
2235
+ }
2236
+ .ermis-message-input__voice-recording-indicator {
2237
+ display: flex;
2238
+ align-items: center;
2239
+ gap: 6px;
2240
+ font-size: var(--ermis-font-size-sm);
2241
+ font-weight: 500;
2242
+ color: var(--ermis-color-danger);
2243
+ }
2244
+ .ermis-message-input__voice-dot {
2245
+ width: 8px;
2246
+ height: 8px;
2247
+ background-color: var(--ermis-color-danger);
2248
+ border-radius: 50%;
2249
+ animation: ermis-blink 1.5s ease-in-out infinite;
2250
+ }
2251
+ @keyframes ermis-blink {
2252
+ 0%, 100% {
2253
+ opacity: 1;
2254
+ }
2255
+ 50% {
2256
+ opacity: 0.4;
2257
+ }
2258
+ }
2012
2259
  .ermis-message-input__emoji-picker {
2013
2260
  position: absolute;
2014
2261
  bottom: 100%;
@@ -2019,6 +2266,44 @@
2019
2266
  box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.15);
2020
2267
  overflow: hidden;
2021
2268
  }
2269
+ .ermis-message-input__sticker-btn {
2270
+ display: inline-flex;
2271
+ align-items: center;
2272
+ justify-content: center;
2273
+ padding: 4px;
2274
+ border: none;
2275
+ background: none;
2276
+ font-size: 1.25rem;
2277
+ cursor: pointer;
2278
+ color: var(--ermis-text-secondary);
2279
+ transition: color var(--ermis-transition);
2280
+ flex-shrink: 0;
2281
+ }
2282
+ .ermis-message-input__sticker-btn:hover,
2283
+ .ermis-message-input__sticker-btn--active {
2284
+ color: var(--ermis-accent);
2285
+ }
2286
+ .ermis-message-input__sticker-btn:disabled {
2287
+ opacity: 0.4;
2288
+ cursor: not-allowed;
2289
+ }
2290
+ .ermis-message-input__sticker-picker-container {
2291
+ position: absolute;
2292
+ bottom: 100%;
2293
+ right: 0;
2294
+ margin-bottom: var(--ermis-spacing-xs);
2295
+ z-index: 100;
2296
+ border-radius: var(--ermis-radius-lg);
2297
+ box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.15);
2298
+ overflow: hidden;
2299
+ }
2300
+ .ermis-message-input__sticker-iframe {
2301
+ border: none;
2302
+ width: 320px;
2303
+ height: 400px;
2304
+ background: var(--ermis-bg-primary);
2305
+ display: block;
2306
+ }
2022
2307
  .ermis-files-preview {
2023
2308
  display: flex;
2024
2309
  gap: var(--ermis-spacing-sm);
@@ -2254,6 +2539,35 @@
2254
2539
  border-top-left-radius: 0;
2255
2540
  border-top-right-radius: 0;
2256
2541
  }
2542
+ .ermis-channel__drop-overlay {
2543
+ position: fixed;
2544
+ inset: 0;
2545
+ z-index: 9999;
2546
+ background-color: var(--ermis-bg-overlay);
2547
+ backdrop-filter: blur(4px);
2548
+ display: flex;
2549
+ align-items: center;
2550
+ justify-content: center;
2551
+ pointer-events: none;
2552
+ }
2553
+ .ermis-channel__drop-overlay-content {
2554
+ border: 2px dashed var(--ermis-accent);
2555
+ border-radius: var(--ermis-radius-lg);
2556
+ padding: var(--ermis-spacing-xl) var(--ermis-spacing-xxl);
2557
+ display: flex;
2558
+ flex-direction: column;
2559
+ align-items: center;
2560
+ gap: var(--ermis-spacing-md);
2561
+ color: var(--ermis-accent);
2562
+ background-color: var(--ermis-bg-primary);
2563
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
2564
+ pointer-events: none;
2565
+ }
2566
+ .ermis-channel__drop-overlay-content span {
2567
+ font-size: var(--ermis-font-size-lg);
2568
+ font-weight: 600;
2569
+ font-family: var(--ermis-font-family);
2570
+ }
2257
2571
 
2258
2572
  /* src/styles/_mentions.css */
2259
2573
  .ermis-message-input__editable-wrapper {
@@ -2323,7 +2637,7 @@
2323
2637
  }
2324
2638
  .ermis-mention-suggestions__item:hover,
2325
2639
  .ermis-mention-suggestions__item--highlighted {
2326
- background-color: var(--ermis-bg-secondary);
2640
+ background-color: var(--ermis-bg-active);
2327
2641
  }
2328
2642
  .ermis-mention-suggestions__name {
2329
2643
  font-size: var(--ermis-font-size-sm);
@@ -2490,11 +2804,11 @@
2490
2804
  opacity: 1;
2491
2805
  }
2492
2806
  .ermis-message-list__item--own .ermis-message-list__actions {
2493
- right: 100%;
2807
+ right: calc(100% + 12px);
2494
2808
  flex-direction: row-reverse;
2495
2809
  }
2496
2810
  .ermis-message-list__item--other .ermis-message-list__actions {
2497
- left: 100%;
2811
+ left: calc(100% + 12px);
2498
2812
  }
2499
2813
  .ermis-message-list__actions-trigger {
2500
2814
  display: inline-flex;
@@ -2589,14 +2903,27 @@
2589
2903
  .ermis-forward-modal__channel-item--selected {
2590
2904
  background: var(--ermis-bg-active);
2591
2905
  }
2592
- .ermis-forward-modal__channel-name {
2906
+ .ermis-forward-modal__channel-name-container {
2593
2907
  flex: 1;
2908
+ display: flex;
2909
+ flex-direction: column;
2910
+ overflow: hidden;
2911
+ }
2912
+ .ermis-forward-modal__channel-name {
2594
2913
  font-size: var(--ermis-font-size-sm);
2595
2914
  color: var(--ermis-text-primary);
2596
2915
  overflow: hidden;
2597
2916
  text-overflow: ellipsis;
2598
2917
  white-space: nowrap;
2599
2918
  }
2919
+ .ermis-forward-modal__channel-parent-name {
2920
+ font-size: var(--ermis-font-size-xs);
2921
+ color: var(--ermis-text-muted);
2922
+ overflow: hidden;
2923
+ text-overflow: ellipsis;
2924
+ white-space: nowrap;
2925
+ margin-bottom: 2px;
2926
+ }
2600
2927
  .ermis-forward-modal__checkbox {
2601
2928
  width: 20px;
2602
2929
  height: 20px;
@@ -2681,6 +3008,10 @@
2681
3008
  font-size: 12px;
2682
3009
  color: var(--ermis-text-secondary);
2683
3010
  overflow: hidden;
3011
+ position: absolute;
3012
+ bottom: 0;
3013
+ left: 0;
3014
+ right: 0;
2684
3015
  }
2685
3016
  .ermis-typing-indicator__dots {
2686
3017
  display: flex;
@@ -2745,6 +3076,9 @@
2745
3076
  opacity: 0.8;
2746
3077
  pointer-events: none;
2747
3078
  }
3079
+ .ermis-message-reactions--own {
3080
+ justify-content: flex-end;
3081
+ }
2748
3082
  .ermis-message-reactions__item {
2749
3083
  position: relative;
2750
3084
  display: inline-flex;
@@ -2800,22 +3134,35 @@
2800
3134
  /* src/styles/_message-quick-reactions.css */
2801
3135
  .ermis-message-quick-reactions {
2802
3136
  position: absolute;
2803
- bottom: calc(100% - 10px);
3137
+ bottom: 100%;
2804
3138
  display: flex;
2805
3139
  align-items: center;
2806
3140
  gap: 2px;
2807
- background-color: var(--ermis-bg-primary);
2808
- border: 1px solid var(--ermis-border);
2809
3141
  padding: 4px;
3142
+ padding-bottom: 8px;
2810
3143
  border-radius: 20px;
2811
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
2812
3144
  opacity: 0;
2813
3145
  visibility: hidden;
2814
- pointer-events: none;
2815
- transform: translateY(8px);
2816
- transition: opacity 0.2s ease, transform 0.2s ease;
3146
+ transform: translateY(4px);
3147
+ transition:
3148
+ opacity 0.1s ease,
3149
+ transform 0.1s ease,
3150
+ visibility 0.1s ease;
2817
3151
  z-index: 20;
2818
3152
  }
3153
+ .ermis-message-quick-reactions::before {
3154
+ content: "";
3155
+ position: absolute;
3156
+ top: 0;
3157
+ left: 0;
3158
+ right: 0;
3159
+ bottom: 4px;
3160
+ background-color: var(--ermis-bg-primary);
3161
+ border: 1px solid var(--ermis-border);
3162
+ border-radius: 20px;
3163
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
3164
+ z-index: -1;
3165
+ }
2819
3166
  .ermis-message-quick-reactions {
2820
3167
  left: 0;
2821
3168
  }
@@ -2823,11 +3170,27 @@
2823
3170
  left: auto;
2824
3171
  right: 0;
2825
3172
  }
2826
- .ermis-message-list__bubble-wrapper:hover .ermis-message-quick-reactions {
3173
+ .ermis-message-list__bubble-wrapper:hover {
3174
+ z-index: 100;
3175
+ }
3176
+ .ermis-message-list__bubble-wrapper:hover .ermis-message-quick-reactions,
3177
+ .ermis-message-quick-reactions:hover {
3178
+ opacity: 1;
3179
+ visibility: visible;
3180
+ transform: translateY(0);
3181
+ }
3182
+ .ermis-message-quick-reactions--expanded {
2827
3183
  opacity: 1;
2828
3184
  visibility: visible;
2829
- pointer-events: auto;
2830
3185
  transform: translateY(0);
3186
+ transition: none !important;
3187
+ will-change:
3188
+ width,
3189
+ height,
3190
+ transform;
3191
+ }
3192
+ .ermis-message-quick-reactions--expanded::before {
3193
+ display: none;
2831
3194
  }
2832
3195
  .ermis-message-list__bubble-wrapper:hover .ermis-message-quick-reactions--disabled {
2833
3196
  opacity: 0.5;
@@ -2864,9 +3227,16 @@
2864
3227
  height: 100%;
2865
3228
  background: var(--ermis-bg-primary);
2866
3229
  border-left: 1px solid var(--ermis-border-base);
3230
+ display: flex;
3231
+ flex-direction: column;
3232
+ overflow: hidden;
3233
+ box-sizing: border-box;
3234
+ }
3235
+ .ermis-channel-info__body {
3236
+ flex: 1;
2867
3237
  overflow-y: auto;
2868
3238
  overflow-x: hidden;
2869
- box-sizing: border-box;
3239
+ scroll-behavior: smooth;
2870
3240
  }
2871
3241
  .ermis-channel-info__header {
2872
3242
  display: flex;
@@ -3134,7 +3504,6 @@
3134
3504
  border-color: var(--ermis-accent);
3135
3505
  }
3136
3506
  .ermis-channel-info__media-section {
3137
- flex: 1;
3138
3507
  display: flex;
3139
3508
  flex-direction: column;
3140
3509
  padding: 0;
@@ -3146,6 +3515,10 @@
3146
3515
  padding: 0 4px;
3147
3516
  gap: 0;
3148
3517
  flex-shrink: 0;
3518
+ position: sticky;
3519
+ top: 0;
3520
+ z-index: 10;
3521
+ background-color: var(--ermis-bg-primary);
3149
3522
  }
3150
3523
  .ermis-channel-info__media-tab {
3151
3524
  flex: 1;
@@ -3192,8 +3565,6 @@
3192
3565
  color: #fff;
3193
3566
  }
3194
3567
  .ermis-channel-info__media-content {
3195
- flex: 1;
3196
- overflow: hidden;
3197
3568
  min-height: 120px;
3198
3569
  }
3199
3570
  .ermis-channel-info__media-grid-row {
@@ -3663,6 +4034,30 @@
3663
4034
  font-weight: 500;
3664
4035
  color: var(--ermis-text-secondary);
3665
4036
  }
4037
+ .ermis-channel-info__preview-actions {
4038
+ display: flex;
4039
+ justify-content: center;
4040
+ padding: 12px 16px;
4041
+ border-bottom: 1px solid var(--ermis-border);
4042
+ }
4043
+ .ermis-channel-info__join-btn {
4044
+ width: 100%;
4045
+ justify-content: center;
4046
+ font-weight: 600;
4047
+ padding: 10px 16px;
4048
+ border-radius: var(--ermis-radius-lg);
4049
+ background-color: var(--ermis-accent);
4050
+ color: #ffffff;
4051
+ border: none;
4052
+ cursor: pointer;
4053
+ transition: opacity 0.2s ease, transform 0.1s ease;
4054
+ }
4055
+ .ermis-channel-info__join-btn:hover {
4056
+ opacity: 0.9;
4057
+ }
4058
+ .ermis-channel-info__join-btn:active {
4059
+ transform: scale(0.98);
4060
+ }
3666
4061
 
3667
4062
  /* src/styles/_add-member-modal.css */
3668
4063
  .ermis-modal-search {
@@ -4273,6 +4668,8 @@
4273
4668
  }
4274
4669
  .ermis-create-channel__users {
4275
4670
  margin-top: var(--ermis-spacing-sm, 0.5rem);
4671
+ display: flex;
4672
+ flex-direction: column;
4276
4673
  }
4277
4674
  .ermis-create-channel__users-title {
4278
4675
  font-size: var(--ermis-font-size-sm, 0.875rem);
@@ -4476,6 +4873,11 @@
4476
4873
  .ermis-call-ui__action-circle:active {
4477
4874
  transform: scale(0.95);
4478
4875
  }
4876
+ .ermis-call-ui__action-circle:disabled {
4877
+ opacity: 0.7;
4878
+ cursor: not-allowed;
4879
+ transform: none;
4880
+ }
4479
4881
  .ermis-call-ui__action-circle--reject {
4480
4882
  background-color: var(--ermis-color-danger);
4481
4883
  box-shadow: 0 4px 20px rgba(239, 68, 68, 0.35);
@@ -4519,7 +4921,7 @@
4519
4921
  .ermis-call-ui__video-remote {
4520
4922
  width: 100%;
4521
4923
  height: 100%;
4522
- object-fit: cover;
4924
+ object-fit: contain;
4523
4925
  }
4524
4926
  .ermis-call-ui__video-local {
4525
4927
  position: absolute;
@@ -4542,7 +4944,7 @@
4542
4944
  .ermis-call-ui__video-local-stream {
4543
4945
  width: 100%;
4544
4946
  height: 100%;
4545
- object-fit: cover;
4947
+ object-fit: contain;
4546
4948
  transform: scaleX(-1);
4547
4949
  }
4548
4950
  .ermis-call-ui__remote-muted-badge {
@@ -4590,6 +4992,35 @@
4590
4992
  padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
4591
4993
  background: linear-gradient(transparent, rgba(0, 0, 0, 0.6));
4592
4994
  }
4995
+ .ermis-call-ui__video-timer {
4996
+ position: absolute;
4997
+ top: 16px;
4998
+ left: 16px;
4999
+ z-index: 15;
5000
+ display: flex;
5001
+ align-items: center;
5002
+ gap: 6px;
5003
+ padding: 4px 12px;
5004
+ border-radius: var(--ermis-radius-full);
5005
+ background: rgba(0, 0, 0, 0.45);
5006
+ backdrop-filter: blur(12px);
5007
+ -webkit-backdrop-filter: blur(12px);
5008
+ border: 1px solid rgba(255, 255, 255, 0.1);
5009
+ color: rgba(255, 255, 255, 0.85);
5010
+ font-size: var(--ermis-font-size-sm);
5011
+ font-variant-numeric: tabular-nums;
5012
+ font-weight: 500;
5013
+ user-select: none;
5014
+ }
5015
+ .ermis-call-ui__video-timer-mic {
5016
+ display: flex;
5017
+ align-items: center;
5018
+ color: #f87171;
5019
+ }
5020
+ .ermis-call-ui__video-timer-mic svg {
5021
+ width: 16px;
5022
+ height: 16px;
5023
+ }
4593
5024
  .ermis-call-ui__audio-container {
4594
5025
  text-align: center;
4595
5026
  padding: 2.5rem var(--ermis-spacing-lg) 2rem;
@@ -4938,6 +5369,19 @@
4938
5369
  transform: none;
4939
5370
  }
4940
5371
  }
5372
+ .ermis-call-ui__spinner {
5373
+ width: 20px;
5374
+ height: 20px;
5375
+ border: 2px solid rgba(255, 255, 255, 0.3);
5376
+ border-radius: 50%;
5377
+ border-top-color: #ffffff;
5378
+ animation: ermis-call-spin 0.8s linear infinite;
5379
+ }
5380
+ @keyframes ermis-call-spin {
5381
+ to {
5382
+ transform: rotate(360deg);
5383
+ }
5384
+ }
4941
5385
 
4942
5386
  /* src/styles/_topic-modal.css */
4943
5387
  .ermis-create-topic__body {
@@ -5164,6 +5608,12 @@
5164
5608
  transform: scale(1);
5165
5609
  }
5166
5610
  }
5611
+ .ermis-lightbox__video-wrapper {
5612
+ position: relative;
5613
+ display: flex;
5614
+ align-items: center;
5615
+ justify-content: center;
5616
+ }
5167
5617
  .ermis-lightbox__video {
5168
5618
  max-width: 90vw;
5169
5619
  max-height: 80vh;
@@ -5172,6 +5622,29 @@
5172
5622
  outline: none;
5173
5623
  animation: ermis-lightbox-zoom-in 0.25s cubic-bezier(0.16, 1, 0.3, 1);
5174
5624
  }
5625
+ .ermis-lightbox__video-retry {
5626
+ position: absolute;
5627
+ inset: 0;
5628
+ display: flex;
5629
+ align-items: center;
5630
+ justify-content: center;
5631
+ background: rgba(0, 0, 0, 0.5);
5632
+ border-radius: 4px;
5633
+ pointer-events: none;
5634
+ }
5635
+ .ermis-lightbox__video-spinner {
5636
+ width: 36px;
5637
+ height: 36px;
5638
+ border: 3px solid rgba(255, 255, 255, 0.2);
5639
+ border-top-color: #fff;
5640
+ border-radius: 50%;
5641
+ animation: ermis-lightbox-spin 0.8s linear infinite;
5642
+ }
5643
+ @keyframes ermis-lightbox-spin {
5644
+ to {
5645
+ transform: rotate(360deg);
5646
+ }
5647
+ }
5175
5648
  .ermis-lightbox__nav {
5176
5649
  position: absolute;
5177
5650
  top: 50%;
@@ -5279,5 +5752,38 @@
5279
5752
  }
5280
5753
  }
5281
5754
 
5755
+ /* src/styles/_preview-overlay.css */
5756
+ .ermis-preview-overlay {
5757
+ display: flex;
5758
+ align-items: center;
5759
+ justify-content: space-between;
5760
+ padding: var(--ermis-spacing-md);
5761
+ background-color: var(--ermis-bg-secondary);
5762
+ border-top: 1px solid var(--ermis-border);
5763
+ font-family: var(--ermis-font-family);
5764
+ }
5765
+ .ermis-preview-overlay__text {
5766
+ font-size: var(--ermis-font-size-sm);
5767
+ color: var(--ermis-text-secondary);
5768
+ font-weight: 500;
5769
+ }
5770
+ .ermis-preview-overlay__button {
5771
+ background-color: var(--ermis-accent);
5772
+ color: #ffffff;
5773
+ border: none;
5774
+ border-radius: var(--ermis-radius-md);
5775
+ padding: var(--ermis-spacing-sm) var(--ermis-spacing-md);
5776
+ font-size: var(--ermis-font-size-sm);
5777
+ font-weight: 600;
5778
+ cursor: pointer;
5779
+ transition: opacity 0.2s ease, transform 0.1s ease;
5780
+ }
5781
+ .ermis-preview-overlay__button:hover {
5782
+ opacity: 0.9;
5783
+ }
5784
+ .ermis-preview-overlay__button:active {
5785
+ transform: scale(0.98);
5786
+ }
5787
+
5282
5788
  /* src/styles/index.css */
5283
5789
  /*# sourceMappingURL=index.css.map */