@ermis-network/ermis-chat-react 1.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 (88) hide show
  1. package/dist/index.cjs +6593 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.css +3375 -0
  4. package/dist/index.css.map +1 -0
  5. package/dist/index.d.mts +1138 -0
  6. package/dist/index.d.ts +1138 -0
  7. package/dist/index.mjs +6500 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +42 -0
  10. package/src/components/Avatar.tsx +102 -0
  11. package/src/components/Channel.tsx +77 -0
  12. package/src/components/ChannelHeader.tsx +85 -0
  13. package/src/components/ChannelInfo/AddMemberModal.tsx +204 -0
  14. package/src/components/ChannelInfo/ChannelInfo.tsx +455 -0
  15. package/src/components/ChannelInfo/ChannelInfoTabs.tsx +282 -0
  16. package/src/components/ChannelInfo/ChannelSettingsPanel.tsx +479 -0
  17. package/src/components/ChannelInfo/EditChannelModal.tsx +272 -0
  18. package/src/components/ChannelInfo/FileListItem.tsx +49 -0
  19. package/src/components/ChannelInfo/LinkListItem.tsx +62 -0
  20. package/src/components/ChannelInfo/MediaGridItem.tsx +90 -0
  21. package/src/components/ChannelInfo/MemberListItem.tsx +85 -0
  22. package/src/components/ChannelInfo/MessageSearchPanel.tsx +333 -0
  23. package/src/components/ChannelInfo/States.tsx +36 -0
  24. package/src/components/ChannelInfo/index.ts +10 -0
  25. package/src/components/ChannelInfo/utils.tsx +49 -0
  26. package/src/components/ChannelList.tsx +395 -0
  27. package/src/components/Dropdown.tsx +120 -0
  28. package/src/components/EditPreview.tsx +102 -0
  29. package/src/components/FilesPreview.tsx +108 -0
  30. package/src/components/ForwardMessageModal.tsx +234 -0
  31. package/src/components/MentionSuggestions.tsx +59 -0
  32. package/src/components/MessageActionsBox.tsx +186 -0
  33. package/src/components/MessageInput.tsx +513 -0
  34. package/src/components/MessageInputDefaults.tsx +50 -0
  35. package/src/components/MessageItem.tsx +218 -0
  36. package/src/components/MessageQuickReactions.tsx +73 -0
  37. package/src/components/MessageReactions.tsx +59 -0
  38. package/src/components/MessageRenderers.tsx +565 -0
  39. package/src/components/Modal.tsx +58 -0
  40. package/src/components/Panel.tsx +64 -0
  41. package/src/components/PinnedMessages.tsx +165 -0
  42. package/src/components/QuotedMessagePreview.tsx +55 -0
  43. package/src/components/ReadReceipts.tsx +80 -0
  44. package/src/components/ReplyPreview.tsx +98 -0
  45. package/src/components/TypingIndicator.tsx +57 -0
  46. package/src/components/VirtualMessageList.tsx +425 -0
  47. package/src/context/ChatProvider.tsx +73 -0
  48. package/src/hooks/useBannedState.ts +48 -0
  49. package/src/hooks/useBlockedState.ts +55 -0
  50. package/src/hooks/useChannel.ts +18 -0
  51. package/src/hooks/useChannelCapabilities.ts +42 -0
  52. package/src/hooks/useChannelData.ts +55 -0
  53. package/src/hooks/useChannelListUpdates.ts +224 -0
  54. package/src/hooks/useChannelMessages.ts +159 -0
  55. package/src/hooks/useChannelRowUpdates.ts +78 -0
  56. package/src/hooks/useChatClient.ts +11 -0
  57. package/src/hooks/useEmojiPicker.ts +53 -0
  58. package/src/hooks/useFileUpload.ts +128 -0
  59. package/src/hooks/useLoadMessages.ts +178 -0
  60. package/src/hooks/useMentions.ts +287 -0
  61. package/src/hooks/useMessageActions.ts +87 -0
  62. package/src/hooks/useMessageSend.ts +164 -0
  63. package/src/hooks/usePendingState.ts +63 -0
  64. package/src/hooks/useScrollToMessage.ts +155 -0
  65. package/src/hooks/useTypingIndicator.ts +86 -0
  66. package/src/index.ts +129 -0
  67. package/src/styles/_add-member-modal.css +122 -0
  68. package/src/styles/_base.css +32 -0
  69. package/src/styles/_channel-info.css +941 -0
  70. package/src/styles/_channel-list.css +217 -0
  71. package/src/styles/_dropdown.css +69 -0
  72. package/src/styles/_forward-modal.css +191 -0
  73. package/src/styles/_mentions.css +102 -0
  74. package/src/styles/_message-actions.css +61 -0
  75. package/src/styles/_message-bubble.css +656 -0
  76. package/src/styles/_message-input.css +389 -0
  77. package/src/styles/_message-list.css +416 -0
  78. package/src/styles/_message-quick-reactions.css +62 -0
  79. package/src/styles/_message-reactions.css +67 -0
  80. package/src/styles/_modal.css +113 -0
  81. package/src/styles/_panel.css +69 -0
  82. package/src/styles/_pinned-messages.css +140 -0
  83. package/src/styles/_search-panel.css +219 -0
  84. package/src/styles/_tokens.css +92 -0
  85. package/src/styles/_typing-indicator.css +59 -0
  86. package/src/styles/index.css +24 -0
  87. package/src/types.ts +955 -0
  88. package/src/utils.ts +242 -0
@@ -0,0 +1,217 @@
1
+ /* ----------------------------------------------------------
2
+ ChannelHeader
3
+ ---------------------------------------------------------- */
4
+ .ermis-channel-header {
5
+ display: flex;
6
+ align-items: center;
7
+ gap: var(--ermis-spacing-md);
8
+ padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
9
+ border-bottom: 1px solid var(--ermis-border);
10
+ background-color: var(--ermis-bg-secondary);
11
+ font-family: var(--ermis-font-family);
12
+ }
13
+
14
+ .ermis-channel-header__info {
15
+ display: flex;
16
+ flex-direction: column;
17
+ min-width: 0;
18
+ }
19
+
20
+ .ermis-channel-header__name {
21
+ font-size: var(--ermis-font-size-base);
22
+ font-weight: 600;
23
+ color: var(--ermis-text-primary);
24
+ white-space: nowrap;
25
+ overflow: hidden;
26
+ text-overflow: ellipsis;
27
+ }
28
+
29
+ .ermis-channel-header__subtitle {
30
+ font-size: var(--ermis-font-size-xs);
31
+ color: var(--ermis-text-muted);
32
+ white-space: nowrap;
33
+ overflow: hidden;
34
+ text-overflow: ellipsis;
35
+ }
36
+
37
+ .ermis-channel-header__info {
38
+ flex: 1;
39
+ }
40
+
41
+ .ermis-channel-header__actions {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: var(--ermis-spacing-sm);
45
+ margin-left: auto;
46
+ flex-shrink: 0;
47
+ }
48
+
49
+ /* ----------------------------------------------------------
50
+ ChannelList
51
+ ---------------------------------------------------------- */
52
+ .ermis-channel-list {
53
+ display: flex;
54
+ flex-direction: column;
55
+ font-family: var(--ermis-font-family);
56
+ height: 100%;
57
+ flex: 1;
58
+ }
59
+
60
+ .ermis-channel-list__loading {
61
+ padding: var(--ermis-spacing-lg);
62
+ color: var(--ermis-text-muted);
63
+ font-size: var(--ermis-font-size-sm);
64
+ text-align: center;
65
+ }
66
+
67
+ .ermis-channel-list__empty {
68
+ padding: var(--ermis-spacing-lg);
69
+ color: var(--ermis-text-muted);
70
+ font-size: var(--ermis-font-size-sm);
71
+ text-align: center;
72
+ }
73
+
74
+ .ermis-channel-list__item {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: var(--ermis-spacing-md);
78
+ padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
79
+ cursor: pointer;
80
+ border-left: 2px solid transparent;
81
+ transition: background-color var(--ermis-transition), border-color var(--ermis-transition);
82
+ }
83
+
84
+ .ermis-channel-list__item:hover {
85
+ background-color: var(--ermis-bg-hover);
86
+ }
87
+
88
+ .ermis-channel-list__item--active {
89
+ background-color: var(--ermis-bg-active);
90
+ border-left-color: var(--ermis-accent);
91
+ }
92
+
93
+ .ermis-channel-list__item-content {
94
+ display: flex;
95
+ flex-direction: column;
96
+ min-width: 0;
97
+ flex: 1;
98
+ }
99
+
100
+ .ermis-channel-list__item-name {
101
+ font-size: var(--ermis-font-size-sm);
102
+ font-weight: 500;
103
+ color: var(--ermis-text-primary);
104
+ white-space: nowrap;
105
+ overflow: hidden;
106
+ text-overflow: ellipsis;
107
+ }
108
+
109
+ .ermis-channel-list__item-last-message {
110
+ font-size: var(--ermis-font-size-xs);
111
+ color: var(--ermis-text-muted);
112
+ white-space: nowrap;
113
+ overflow: hidden;
114
+ text-overflow: ellipsis;
115
+ margin-top: 2px;
116
+ }
117
+
118
+ .ermis-channel-list__item-last-message-user {
119
+ color: var(--ermis-text-secondary);
120
+ }
121
+
122
+ /* --- Unread channel indicator --- */
123
+ .ermis-channel-list__item--unread .ermis-channel-list__item-name {
124
+ font-weight: 700;
125
+ color: var(--ermis-text-primary);
126
+ }
127
+
128
+ .ermis-channel-list__item--unread .ermis-channel-list__item-last-message {
129
+ color: var(--ermis-text-secondary);
130
+ font-weight: 600;
131
+ }
132
+
133
+ .ermis-channel-list__unread-badge {
134
+ display: inline-flex;
135
+ align-items: center;
136
+ justify-content: center;
137
+ min-width: 20px;
138
+ height: 20px;
139
+ padding: 0 5px;
140
+ border-radius: var(--ermis-radius-full);
141
+ background-color: #ef4444;
142
+ color: #fff;
143
+ font-size: 0.625rem;
144
+ font-weight: 700;
145
+ line-height: 1;
146
+ flex-shrink: 0;
147
+ }
148
+
149
+ /* --- Blocked channel indicator --- */
150
+ .ermis-channel-list__item--blocked {
151
+ opacity: 0.5;
152
+ }
153
+
154
+ .ermis-channel-list__blocked-icon {
155
+ display: inline-flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ flex-shrink: 0;
159
+ color: var(--ermis-text-muted);
160
+ }
161
+
162
+ /* --- Pending channel indicator --- */
163
+ .ermis-channel-list__item--pending {
164
+ border-left: 3px solid var(--ermis-color-amber-500, #f59e0b);
165
+ background-color: var(--ermis-color-amber-50, #fffbeb);
166
+ }
167
+
168
+ .ermis-channel-list__pending-badge {
169
+ display: inline-flex;
170
+ padding: 3px 6px;
171
+ background-color: var(--ermis-color-amber-100, #fef3c7);
172
+ color: var(--ermis-color-amber-700, #b45309);
173
+ border-radius: 6px;
174
+ font-size: 0.6rem;
175
+ font-weight: 600;
176
+ text-transform: uppercase;
177
+ letter-spacing: 0.05em;
178
+ flex-shrink: 0;
179
+ }
180
+
181
+ /* --- Accordion Header --- */
182
+ .ermis-channel-list__accordion-header {
183
+ display: flex;
184
+ align-items: center;
185
+ justify-content: space-between;
186
+ padding: 16px 12px 6px 16px;
187
+ background-color: transparent;
188
+ cursor: pointer;
189
+ color: var(--ermis-text-muted, #65676b);
190
+ font-size: 0.7rem;
191
+ font-weight: 700;
192
+ text-transform: uppercase;
193
+ letter-spacing: 0.08em;
194
+ transition: color 0.2s ease;
195
+ user-select: none;
196
+ }
197
+
198
+ .ermis-channel-list__accordion-header:hover {
199
+ color: var(--ermis-accent, #005fff);
200
+ }
201
+
202
+ .ermis-channel-list__accordion-header--static {
203
+ cursor: default;
204
+ }
205
+
206
+ .ermis-channel-list__accordion-header--static:hover {
207
+ color: var(--ermis-text-muted, #65676b);
208
+ }
209
+
210
+ .ermis-channel-list__accordion-icon {
211
+ transform: rotate(-90deg);
212
+ transition: transform 0.2s ease;
213
+ }
214
+
215
+ .ermis-channel-list__accordion-icon--expanded {
216
+ transform: rotate(0deg);
217
+ }
@@ -0,0 +1,69 @@
1
+ /* ----------------------------------------------------------
2
+ Generic Dropdown
3
+ ---------------------------------------------------------- */
4
+
5
+ .ermis-dropdown {
6
+ font-family: var(--ermis-font-family);
7
+ animation: dropdown-fade-up 0.15s ease-out;
8
+ }
9
+
10
+ .ermis-dropdown__menu {
11
+ background-color: var(--ermis-bg-primary);
12
+ border: 1px solid var(--ermis-border);
13
+ border-radius: var(--ermis-radius-md);
14
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
15
+ min-width: 160px;
16
+ padding: var(--ermis-spacing-xs) 0;
17
+ display: flex;
18
+ flex-direction: column;
19
+ overflow: hidden;
20
+ }
21
+
22
+ .ermis-dropdown__item {
23
+ background: none;
24
+ border: none;
25
+ width: 100%;
26
+ text-align: left;
27
+ padding: var(--ermis-spacing-xs) var(--ermis-spacing-md);
28
+ font-size: var(--ermis-font-size-sm);
29
+ color: var(--ermis-text-primary);
30
+ cursor: pointer;
31
+ display: flex;
32
+ align-items: center;
33
+ gap: var(--ermis-spacing-sm);
34
+ transition: background-color 0.15s;
35
+ }
36
+
37
+ .ermis-dropdown__item:disabled {
38
+ opacity: 0.5;
39
+ cursor: not-allowed;
40
+ }
41
+
42
+ .ermis-dropdown__item:hover {
43
+ background-color: var(--ermis-bg-hover);
44
+ }
45
+
46
+ .ermis-dropdown__divider {
47
+ height: 1px;
48
+ background-color: var(--ermis-border);
49
+ margin: var(--ermis-spacing-xs) 0;
50
+ }
51
+
52
+ .ermis-dropdown__item--danger {
53
+ color: #e74c3c;
54
+ }
55
+
56
+ .ermis-dropdown__item--danger:hover {
57
+ background-color: rgba(231, 76, 60, 0.1);
58
+ }
59
+
60
+ @keyframes dropdown-fade-up {
61
+ 0% {
62
+ opacity: 0;
63
+ transform: translateY(4px) scale(0.98);
64
+ }
65
+ 100% {
66
+ opacity: 1;
67
+ transform: translateY(0) scale(1);
68
+ }
69
+ }
@@ -0,0 +1,191 @@
1
+ /* ============================================================
2
+ Forward Message Modal
3
+ ============================================================ */
4
+
5
+ /* Message preview */
6
+ .ermis-forward-modal__preview {
7
+ padding: var(--ermis-spacing-sm) var(--ermis-spacing-lg);
8
+ border-bottom: 1px solid var(--ermis-border);
9
+ background: var(--ermis-bg-primary);
10
+ }
11
+
12
+ .ermis-forward-modal__preview-sender {
13
+ font-size: var(--ermis-font-size-xs);
14
+ font-weight: 600;
15
+ color: var(--ermis-accent);
16
+ margin-bottom: 2px;
17
+ }
18
+
19
+ .ermis-forward-modal__preview-text {
20
+ font-size: var(--ermis-font-size-sm);
21
+ color: var(--ermis-text-secondary);
22
+ line-height: 1.4;
23
+ overflow: hidden;
24
+ text-overflow: ellipsis;
25
+ display: -webkit-box;
26
+ -webkit-line-clamp: 2;
27
+ line-clamp: 2;
28
+ -webkit-box-orient: vertical;
29
+ }
30
+
31
+ .ermis-forward-modal__preview-attachments {
32
+ font-size: var(--ermis-font-size-xs);
33
+ color: var(--ermis-text-muted);
34
+ margin-top: 4px;
35
+ }
36
+
37
+ /* Search */
38
+ .ermis-forward-modal__search-wrapper {
39
+ padding: var(--ermis-spacing-sm) var(--ermis-spacing-lg);
40
+ border-bottom: 1px solid var(--ermis-border);
41
+ }
42
+
43
+ .ermis-forward-modal__search {
44
+ width: 100%;
45
+ padding: 8px 12px;
46
+ background: var(--ermis-bg-primary);
47
+ border: 1px solid var(--ermis-border);
48
+ border-radius: var(--ermis-radius-md);
49
+ color: var(--ermis-text-primary);
50
+ font-size: var(--ermis-font-size-sm);
51
+ font-family: var(--ermis-font-family);
52
+ outline: none;
53
+ transition: border-color var(--ermis-transition);
54
+ box-sizing: border-box;
55
+ }
56
+
57
+ .ermis-forward-modal__search:focus {
58
+ border-color: var(--ermis-accent);
59
+ }
60
+
61
+ .ermis-forward-modal__search::placeholder {
62
+ color: var(--ermis-text-muted);
63
+ }
64
+
65
+ /* Channel list */
66
+ .ermis-forward-modal__channel-list {
67
+ flex: 1;
68
+ overflow-y: auto;
69
+ min-height: 160px;
70
+ max-height: 320px;
71
+ padding: var(--ermis-spacing-xs) 0;
72
+ }
73
+
74
+ /* Channel item */
75
+ .ermis-forward-modal__channel-item {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: var(--ermis-spacing-sm);
79
+ padding: var(--ermis-spacing-sm) var(--ermis-spacing-lg);
80
+ cursor: pointer;
81
+ transition: background var(--ermis-transition);
82
+ }
83
+
84
+ .ermis-forward-modal__channel-item:hover {
85
+ background: var(--ermis-bg-hover);
86
+ }
87
+
88
+ .ermis-forward-modal__channel-item--selected {
89
+ background: var(--ermis-bg-active);
90
+ }
91
+
92
+ .ermis-forward-modal__channel-name {
93
+ flex: 1;
94
+ font-size: var(--ermis-font-size-sm);
95
+ color: var(--ermis-text-primary);
96
+ overflow: hidden;
97
+ text-overflow: ellipsis;
98
+ white-space: nowrap;
99
+ }
100
+
101
+ /* Checkbox */
102
+ .ermis-forward-modal__checkbox {
103
+ width: 20px;
104
+ height: 20px;
105
+ border: 2px solid var(--ermis-text-muted);
106
+ border-radius: var(--ermis-radius-sm);
107
+ display: flex;
108
+ align-items: center;
109
+ justify-content: center;
110
+ transition: all var(--ermis-transition);
111
+ flex-shrink: 0;
112
+ }
113
+
114
+ .ermis-forward-modal__checkbox--checked {
115
+ background: var(--ermis-accent);
116
+ border-color: var(--ermis-accent);
117
+ color: #fff;
118
+ }
119
+
120
+ /* Loading / empty */
121
+ .ermis-forward-modal__loading,
122
+ .ermis-forward-modal__empty {
123
+ padding: var(--ermis-spacing-lg);
124
+ text-align: center;
125
+ color: var(--ermis-text-muted);
126
+ font-size: var(--ermis-font-size-sm);
127
+ }
128
+
129
+ /* ----------------------------------------------------------
130
+ Forwarded indicator on message items
131
+ ---------------------------------------------------------- */
132
+ .ermis-message-list__forwarded-indicator {
133
+ display: block;
134
+ font-size: var(--ermis-font-size-xs);
135
+ color: var(--ermis-text-muted);
136
+ font-style: italic;
137
+ margin-bottom: 2px;
138
+ width: 100%;
139
+ }
140
+ /* Results */
141
+ .ermis-forward-modal__results {
142
+ padding: var(--ermis-spacing-sm) var(--ermis-spacing-lg);
143
+ border-top: 1px solid var(--ermis-border);
144
+ }
145
+
146
+ .ermis-forward-modal__results-success {
147
+ font-size: var(--ermis-font-size-sm);
148
+ color: #34d399;
149
+ }
150
+
151
+ .ermis-forward-modal__results-failed {
152
+ font-size: var(--ermis-font-size-sm);
153
+ color: #f87171;
154
+ margin-top: 2px;
155
+ }
156
+
157
+ /* Footer buttons */
158
+ .ermis-forward-modal__btn {
159
+ padding: 8px 16px;
160
+ border: none;
161
+ border-radius: var(--ermis-radius-md);
162
+ font-size: var(--ermis-font-size-sm);
163
+ font-weight: 500;
164
+ cursor: pointer;
165
+ transition: all var(--ermis-transition);
166
+ font-family: var(--ermis-font-family);
167
+ }
168
+
169
+ .ermis-forward-modal__btn--cancel {
170
+ background: transparent;
171
+ color: var(--ermis-text-secondary);
172
+ }
173
+
174
+ .ermis-forward-modal__btn--cancel:hover {
175
+ background: var(--ermis-bg-hover);
176
+ color: var(--ermis-text-primary);
177
+ }
178
+
179
+ .ermis-forward-modal__btn--send {
180
+ background: var(--ermis-accent);
181
+ color: #fff;
182
+ }
183
+
184
+ .ermis-forward-modal__btn--send:hover:not(:disabled) {
185
+ background: var(--ermis-accent-hover);
186
+ }
187
+
188
+ .ermis-forward-modal__btn--send:disabled {
189
+ opacity: 0.5;
190
+ cursor: not-allowed;
191
+ }
@@ -0,0 +1,102 @@
1
+ /* --- ContentEditable mention input --- */
2
+ .ermis-message-input__editable-wrapper {
3
+ flex: 1;
4
+ position: relative;
5
+ min-width: 0;
6
+ display: flex;
7
+ align-items: center;
8
+ gap: var(--ermis-spacing-xs);
9
+ }
10
+
11
+ .ermis-message-input__editable {
12
+ flex: 1;
13
+ min-width: 0;
14
+ border: 1px solid var(--ermis-border);
15
+ border-radius: var(--ermis-radius-md);
16
+ padding: var(--ermis-spacing-sm) var(--ermis-spacing-md);
17
+ font-size: var(--ermis-font-size-sm);
18
+ font-family: var(--ermis-font-family);
19
+ color: var(--ermis-text-primary);
20
+ background-color: var(--ermis-bg-primary);
21
+ outline: none;
22
+ transition: border-color var(--ermis-transition);
23
+ line-height: 1.5;
24
+ min-height: 2.25rem;
25
+ max-height: 8rem;
26
+ overflow-y: auto;
27
+ white-space: pre-wrap;
28
+ word-break: break-word;
29
+ }
30
+
31
+ .ermis-message-input__editable:focus {
32
+ border-color: var(--ermis-accent);
33
+ }
34
+
35
+ .ermis-message-input__editable:empty::before {
36
+ content: attr(data-placeholder);
37
+ color: var(--ermis-text-muted);
38
+ pointer-events: none;
39
+ }
40
+
41
+ /* Atomic mention span inside contentEditable */
42
+ .ermis-message-input__mention-span {
43
+ color: var(--ermis-accent);
44
+ font-weight: 600;
45
+ user-select: all;
46
+ cursor: default;
47
+ border-radius: 3px;
48
+ padding: 0 1px;
49
+ }
50
+
51
+ /* --- Mention Suggestion Box --- */
52
+ .ermis-mention-suggestions {
53
+ position: absolute;
54
+ bottom: 100%;
55
+ left: 0;
56
+ right: 0;
57
+ max-height: 200px;
58
+ overflow-y: auto;
59
+ background-color: var(--ermis-bg-primary);
60
+ border: 1px solid var(--ermis-border);
61
+ border-radius: var(--ermis-radius-md);
62
+ box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.15);
63
+ margin-bottom: var(--ermis-spacing-xs);
64
+ z-index: 100;
65
+ }
66
+
67
+ .ermis-mention-suggestions__item {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: var(--ermis-spacing-sm);
71
+ padding: var(--ermis-spacing-sm) var(--ermis-spacing-md);
72
+ cursor: pointer;
73
+ transition: background-color 0.1s;
74
+ }
75
+
76
+ .ermis-mention-suggestions__item:hover,
77
+ .ermis-mention-suggestions__item--highlighted {
78
+ background-color: var(--ermis-bg-secondary);
79
+ }
80
+
81
+ .ermis-mention-suggestions__name {
82
+ font-size: var(--ermis-font-size-sm);
83
+ color: var(--ermis-text-primary);
84
+ font-weight: 500;
85
+ overflow: hidden;
86
+ text-overflow: ellipsis;
87
+ white-space: nowrap;
88
+ }
89
+
90
+ .ermis-mention-suggestions__all-icon {
91
+ width: 24px;
92
+ height: 24px;
93
+ border-radius: 50%;
94
+ background-color: var(--ermis-accent);
95
+ color: #fff;
96
+ display: flex;
97
+ align-items: center;
98
+ justify-content: center;
99
+ font-size: 0.75rem;
100
+ font-weight: 700;
101
+ flex-shrink: 0;
102
+ }
@@ -0,0 +1,61 @@
1
+ /* ----------------------------------------------------------
2
+ Message Actions (Context Menu & Hover Button)
3
+ ---------------------------------------------------------- */
4
+
5
+ /* Hover button container on the message item */
6
+ .ermis-message-list__actions {
7
+ position: absolute;
8
+ top: 50%;
9
+ transform: translateY(-50%);
10
+ opacity: 0;
11
+ display: inline-flex;
12
+ align-items: center;
13
+ gap: 2px;
14
+ background-color: var(--ermis-bg-secondary);
15
+ border: 1px solid var(--ermis-border);
16
+ border-radius: var(--ermis-radius-sm);
17
+ padding: 2px;
18
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
19
+ transition: opacity 0.2s;
20
+ z-index: 10;
21
+ }
22
+
23
+ .ermis-message-list__bubble-wrapper:hover .ermis-message-list__actions,
24
+ .ermis-message-list__actions--active {
25
+ opacity: 1;
26
+ }
27
+
28
+ /* Position container for other (left) vs own (right) */
29
+ .ermis-message-list__item--own .ermis-message-list__actions {
30
+ right: 100%;
31
+ flex-direction: row-reverse;
32
+ }
33
+
34
+ .ermis-message-list__item--other .ermis-message-list__actions {
35
+ left: 100%;
36
+ }
37
+
38
+ /* Individual action buttons */
39
+ .ermis-message-list__actions-trigger {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ background: none;
44
+ border: none;
45
+ border-radius: var(--ermis-radius-sm);
46
+ padding: 4px;
47
+ cursor: pointer;
48
+ color: var(--ermis-text-secondary);
49
+ transition: background-color var(--ermis-transition), color var(--ermis-transition);
50
+ }
51
+
52
+ .ermis-message-list__actions-trigger:disabled {
53
+ opacity: 0.4;
54
+ cursor: not-allowed;
55
+ }
56
+
57
+ .ermis-message-list__actions-trigger:hover:not(:disabled) {
58
+ background-color: var(--ermis-bg-hover);
59
+ color: var(--ermis-text-primary);
60
+ }
61
+