@ermis-network/ermis-chat-react 1.0.9 → 2.0.1

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 (113) hide show
  1. package/README.md +144 -0
  2. package/dist/index.cjs +8320 -3427
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.css +1277 -291
  5. package/dist/index.css.map +1 -1
  6. package/dist/index.d.mts +1131 -99
  7. package/dist/index.d.ts +1131 -99
  8. package/dist/index.mjs +8168 -3319
  9. package/dist/index.mjs.map +1 -1
  10. package/package.json +9 -4
  11. package/src/channelTypeUtils.ts +1 -1
  12. package/src/components/Avatar.tsx +2 -1
  13. package/src/components/Channel.tsx +6 -5
  14. package/src/components/ChannelActions.tsx +67 -3
  15. package/src/components/ChannelHeader.tsx +27 -37
  16. package/src/components/ChannelInfo/AddMemberModal.tsx +12 -2
  17. package/src/components/ChannelInfo/ChannelInfo.tsx +410 -187
  18. package/src/components/ChannelInfo/ChannelInfoTabs.tsx +59 -297
  19. package/src/components/ChannelInfo/ChannelSettingsPanel.tsx +30 -174
  20. package/src/components/ChannelInfo/EditChannelModal.tsx +6 -3
  21. package/src/components/ChannelInfo/MediaGridItem.tsx +215 -68
  22. package/src/components/ChannelInfo/MemberListItem.tsx +2 -3
  23. package/src/components/ChannelInfo/MessageSearchPanel.tsx +27 -126
  24. package/src/components/ChannelInfo/States.tsx +1 -1
  25. package/src/components/ChannelInfo/index.ts +3 -0
  26. package/src/components/ChannelInfo/useChannelInfoTabs.tsx +427 -0
  27. package/src/components/ChannelInfo/useChannelSettings.ts +212 -0
  28. package/src/components/ChannelInfo/useMessageSearch.tsx +141 -0
  29. package/src/components/ChannelList.tsx +247 -301
  30. package/src/components/CreateChannelModal.tsx +290 -93
  31. package/src/components/Dropdown.tsx +1 -16
  32. package/src/components/EditPreview.tsx +1 -0
  33. package/src/components/ErmisCallProvider.tsx +72 -17
  34. package/src/components/ErmisCallUI.tsx +43 -20
  35. package/src/components/FilesPreview.tsx +8 -12
  36. package/src/components/FlatTopicGroupItem.tsx +243 -0
  37. package/src/components/ForwardMessageModal.tsx +43 -81
  38. package/src/components/MediaLightbox.tsx +454 -292
  39. package/src/components/MentionSuggestions.tsx +47 -35
  40. package/src/components/MessageActionsBox.tsx +6 -1
  41. package/src/components/MessageInput.tsx +165 -17
  42. package/src/components/MessageInputDefaults.tsx +127 -1
  43. package/src/components/MessageItem.tsx +155 -43
  44. package/src/components/MessageQuickReactions.tsx +153 -23
  45. package/src/components/MessageReactions.tsx +49 -3
  46. package/src/components/MessageRenderers.tsx +1114 -445
  47. package/src/components/Panel.tsx +1 -14
  48. package/src/components/PinnedMessages.tsx +55 -15
  49. package/src/components/PreviewOverlay.tsx +24 -0
  50. package/src/components/QuotedMessagePreview.tsx +99 -8
  51. package/src/components/ReadReceipts.tsx +2 -1
  52. package/src/components/RecoveryPin/RecoveryPin.tsx +279 -0
  53. package/src/components/RecoveryPin/index.ts +19 -0
  54. package/src/components/TopicList.tsx +236 -0
  55. package/src/components/TopicModal.tsx +4 -1
  56. package/src/components/TypingIndicator.tsx +17 -8
  57. package/src/components/UserPicker.tsx +94 -16
  58. package/src/components/VirtualMessageList.tsx +419 -113
  59. package/src/context/ChatComponentsContext.tsx +14 -0
  60. package/src/context/ChatProvider.tsx +44 -14
  61. package/src/context/ErmisCallContext.tsx +4 -0
  62. package/src/hooks/useChannelCapabilities.ts +7 -4
  63. package/src/hooks/useChannelData.ts +10 -3
  64. package/src/hooks/useChannelListUpdates.ts +94 -21
  65. package/src/hooks/useChannelMessages.ts +391 -42
  66. package/src/hooks/useChannelRowUpdates.ts +36 -5
  67. package/src/hooks/useChatUser.ts +39 -0
  68. package/src/hooks/useContactChannels.ts +45 -0
  69. package/src/hooks/useContactCount.ts +50 -0
  70. package/src/hooks/useDownloadHandler.ts +36 -0
  71. package/src/hooks/useDragAndDrop.ts +79 -0
  72. package/src/hooks/useE2eeAttachmentRenderer.ts +204 -0
  73. package/src/hooks/useE2eeFileUpload.ts +38 -0
  74. package/src/hooks/useFileUpload.ts +25 -5
  75. package/src/hooks/useForwardMessage.ts +309 -0
  76. package/src/hooks/useInviteChannels.ts +88 -0
  77. package/src/hooks/useInviteCount.ts +104 -0
  78. package/src/hooks/useLoadMessages.ts +16 -4
  79. package/src/hooks/useMentions.ts +60 -7
  80. package/src/hooks/useMessageActions.ts +19 -10
  81. package/src/hooks/useMessageSend.ts +64 -12
  82. package/src/hooks/usePendingE2eeSends.ts +29 -0
  83. package/src/hooks/usePendingState.ts +21 -4
  84. package/src/hooks/usePreviewState.ts +69 -0
  85. package/src/hooks/useRecoveryPin.ts +287 -0
  86. package/src/hooks/useScrollToMessage.ts +29 -4
  87. package/src/hooks/useStickerPicker.ts +62 -0
  88. package/src/hooks/useTopicGroupUpdates.ts +235 -0
  89. package/src/index.ts +79 -6
  90. package/src/messageTypeUtils.ts +27 -1
  91. package/src/styles/_base.css +0 -1
  92. package/src/styles/_call-ui.css +59 -2
  93. package/src/styles/_channel-info.css +50 -4
  94. package/src/styles/_channel-list.css +131 -68
  95. package/src/styles/_create-channel-modal.css +10 -0
  96. package/src/styles/_forward-modal.css +16 -1
  97. package/src/styles/_media-lightbox.css +67 -2
  98. package/src/styles/_mentions.css +1 -1
  99. package/src/styles/_message-actions.css +3 -4
  100. package/src/styles/_message-bubble.css +631 -112
  101. package/src/styles/_message-input.css +139 -0
  102. package/src/styles/_message-list.css +91 -18
  103. package/src/styles/_message-quick-reactions.css +105 -32
  104. package/src/styles/_message-reactions.css +22 -32
  105. package/src/styles/_modal.css +2 -1
  106. package/src/styles/_preview-overlay.css +38 -0
  107. package/src/styles/_recovery-pin.css +97 -0
  108. package/src/styles/_tokens.css +22 -20
  109. package/src/styles/_typing-indicator.css +26 -10
  110. package/src/styles/index.css +2 -0
  111. package/src/types.ts +477 -15
  112. package/src/utils/avatarColors.ts +48 -0
  113. package/src/utils.ts +219 -16
@@ -6,9 +6,17 @@
6
6
  height: 100%;
7
7
  background: var(--ermis-bg-primary);
8
8
  border-left: 1px solid var(--ermis-border-base);
9
+ display: flex;
10
+ flex-direction: column;
11
+ overflow: hidden;
12
+ box-sizing: border-box;
13
+ }
14
+
15
+ .ermis-channel-info__body {
16
+ flex: 1;
9
17
  overflow-y: auto;
10
18
  overflow-x: hidden;
11
- box-sizing: border-box;
19
+ scroll-behavior: smooth;
12
20
  }
13
21
 
14
22
  .ermis-channel-info__header {
@@ -323,7 +331,6 @@
323
331
  ============================================ */
324
332
 
325
333
  .ermis-channel-info__media-section {
326
- flex: 1;
327
334
  display: flex;
328
335
  flex-direction: column;
329
336
  padding: 0;
@@ -336,6 +343,10 @@
336
343
  padding: 0 4px;
337
344
  gap: 0;
338
345
  flex-shrink: 0;
346
+ position: sticky;
347
+ top: 0;
348
+ z-index: 10;
349
+ background-color: var(--ermis-bg-primary);
339
350
  }
340
351
 
341
352
  .ermis-channel-info__media-tab {
@@ -393,8 +404,6 @@
393
404
  ============================================ */
394
405
 
395
406
  .ermis-channel-info__media-content {
396
- flex: 1;
397
- overflow: hidden;
398
407
  min-height: 120px;
399
408
  }
400
409
 
@@ -491,6 +500,15 @@
491
500
  margin-left: 2px;
492
501
  }
493
502
 
503
+ .ermis-channel-info__media-spinner {
504
+ width: 16px;
505
+ height: 16px;
506
+ border: 2px solid rgba(255, 255, 255, 0.35);
507
+ border-top-color: #fff;
508
+ border-radius: 50%;
509
+ animation: ermis-lightbox-spin 0.8s linear infinite;
510
+ }
511
+
494
512
  /* ============================================
495
513
  Links List
496
514
  ============================================ */
@@ -960,3 +978,31 @@
960
978
  font-weight: 500;
961
979
  color: var(--ermis-text-secondary);
962
980
  }
981
+
982
+ .ermis-channel-info__preview-actions {
983
+ display: flex;
984
+ justify-content: center;
985
+ padding: 12px 16px;
986
+ border-bottom: 1px solid var(--ermis-border);
987
+ }
988
+
989
+ .ermis-channel-info__join-btn {
990
+ width: 100%;
991
+ justify-content: center;
992
+ font-weight: 600;
993
+ padding: 10px 16px;
994
+ border-radius: var(--ermis-radius-lg);
995
+ background-color: var(--ermis-accent);
996
+ color: #ffffff;
997
+ border: none;
998
+ cursor: pointer;
999
+ transition: opacity 0.2s ease, transform 0.1s ease;
1000
+ }
1001
+
1002
+ .ermis-channel-info__join-btn:hover {
1003
+ opacity: 0.9;
1004
+ }
1005
+
1006
+ .ermis-channel-info__join-btn:active {
1007
+ transform: scale(0.98);
1008
+ }
@@ -4,10 +4,10 @@
4
4
  .ermis-channel-header {
5
5
  display: flex;
6
6
  align-items: center;
7
- gap: var(--ermis-spacing-md);
7
+ gap: var(--ermis-spacing-sm);
8
8
  padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
9
9
  border-bottom: 1px solid var(--ermis-border);
10
- background-color: var(--ermis-bg-secondary);
10
+ background-color: var(--ermis-bg-primary);
11
11
  font-family: var(--ermis-font-family);
12
12
  }
13
13
 
@@ -37,15 +37,15 @@
37
37
  }
38
38
 
39
39
  .ermis-channel-header__topic-avatar {
40
- width: 32px;
41
- height: 32px;
42
- min-width: 32px;
40
+ width: 44px;
41
+ height: 44px;
42
+ min-width: 44px;
43
43
  border-radius: var(--ermis-radius-md);
44
44
  background-color: var(--ermis-bg-primary);
45
45
  display: flex;
46
46
  align-items: center;
47
47
  justify-content: center;
48
- font-size: 16px;
48
+ font-size: 24px;
49
49
  color: var(--ermis-text-secondary);
50
50
  }
51
51
 
@@ -132,7 +132,7 @@
132
132
  display: flex;
133
133
  align-items: center;
134
134
  gap: var(--ermis-spacing-md);
135
- padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
135
+ padding: calc(var(--ermis-spacing-md) - 0.05rem) var(--ermis-spacing-lg);
136
136
  cursor: pointer;
137
137
  border-left: 2px solid transparent;
138
138
  transition: background-color var(--ermis-transition), border-color var(--ermis-transition);
@@ -180,6 +180,31 @@
180
180
  background-color: var(--ermis-text-muted);
181
181
  }
182
182
 
183
+ .ermis-channel-list__avatar-unread-badge {
184
+ display: none;
185
+ position: absolute;
186
+ top: -2px;
187
+ right: -2px;
188
+ min-width: 16px;
189
+ height: 16px;
190
+ padding: 0 4px;
191
+ border-radius: var(--ermis-radius-full);
192
+ background-color: var(--ermis-color-danger, #ef4444);
193
+ color: #fff;
194
+ font-size: 9px;
195
+ font-weight: 700;
196
+ line-height: 1;
197
+ border: 1.5px solid var(--ermis-bg-primary);
198
+ z-index: 2;
199
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
200
+ }
201
+
202
+ .channel-sidebar-collapsed .ermis-channel-list__avatar-unread-badge {
203
+ display: flex;
204
+ align-items: center;
205
+ justify-content: center;
206
+ }
207
+
183
208
  .ermis-channel-list__item-top-row {
184
209
  display: flex;
185
210
  align-items: baseline;
@@ -196,7 +221,7 @@
196
221
  }
197
222
 
198
223
  .ermis-channel-list__item-name {
199
- font-size: var(--ermis-font-size-sm);
224
+ font-size: calc(var(--ermis-font-size-sm) + 1px);
200
225
  font-weight: 500;
201
226
  color: var(--ermis-text-primary);
202
227
  white-space: nowrap;
@@ -214,7 +239,7 @@
214
239
  }
215
240
 
216
241
  .ermis-channel-list__item-last-message {
217
- font-size: var(--ermis-font-size-xs);
242
+ font-size: calc(var(--ermis-font-size-sm));
218
243
  color: var(--ermis-text-muted);
219
244
  white-space: nowrap;
220
245
  overflow: hidden;
@@ -245,7 +270,7 @@
245
270
 
246
271
  .ermis-channel-list__pinned-icon {
247
272
  position: absolute;
248
- top: -5px;
273
+ top: 0px;
249
274
  right: 0px;
250
275
  color: var(--ermis-color-danger, #ef4444);
251
276
  display: inline-flex;
@@ -265,6 +290,10 @@
265
290
  color: var(--ermis-text-secondary);
266
291
  }
267
292
 
293
+ .ermis-channel-list__item-last-message-source {
294
+ color: var(--ermis-text-secondary);
295
+ }
296
+
268
297
  .ermis-channel-list__item-actions-wrapper,
269
298
  .ermis-channel-list__topic-actions-wrapper {
270
299
  position: absolute;
@@ -307,13 +336,12 @@
307
336
 
308
337
  /* --- Unread channel indicator --- */
309
338
  .ermis-channel-list__item--unread .ermis-channel-list__item-name {
310
- font-weight: 700;
339
+ font-weight: 600;
311
340
  color: var(--ermis-text-primary);
312
341
  }
313
342
 
314
343
  .ermis-channel-list__item--unread .ermis-channel-list__item-last-message {
315
344
  color: var(--ermis-text-secondary);
316
- font-weight: 600;
317
345
  }
318
346
 
319
347
  .ermis-channel-list__unread-badge {
@@ -397,91 +425,126 @@
397
425
  transform: rotate(0deg);
398
426
  }
399
427
 
400
- /* --- Topic Group --- */
401
- .ermis-channel-list__topic-group {
428
+ /* --- Topic Hashtag Avatar (used by TopicList) --- */
429
+ .ermis-channel-list__topic-hashtag {
402
430
  display: flex;
403
- flex-direction: column;
431
+ align-items: center;
432
+ justify-content: center;
433
+ width: 24px;
434
+ height: 24px;
435
+ background-color: transparent;
436
+ color: var(--ermis-text-muted);
437
+ border-radius: var(--ermis-radius-full);
438
+ font-size: 0.95rem;
439
+ font-weight: 600;
440
+ flex-shrink: 0;
404
441
  }
405
442
 
406
- .ermis-channel-list__topic-header {
443
+ /* --- Topic Pills (FlatTopicGroupItem) --- */
444
+ .ermis-channel-list__topic-pills {
407
445
  display: flex;
408
446
  align-items: center;
409
- gap: var(--ermis-spacing-md);
410
- padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
411
- cursor: pointer;
412
- border-left: 2px solid transparent;
413
- transition: background-color var(--ermis-transition);
414
- position: relative;
415
- }
416
-
417
- .ermis-channel-list__topic-header:hover {
418
- background-color: var(--ermis-bg-hover);
447
+ gap: var(--ermis-spacing-xs);
448
+ flex: 1;
449
+ min-width: 0;
450
+ overflow: hidden;
419
451
  }
420
452
 
421
- .ermis-channel-list__topic-header-name {
422
- font-size: var(--ermis-font-size-sm);
423
- font-weight: 600;
424
- color: var(--ermis-text-primary);
425
- white-space: nowrap;
426
- overflow: hidden;
427
- text-overflow: ellipsis;
428
- flex: 1;
453
+ .ermis-channel-list__topic-pill {
454
+ display: inline-flex;
455
+ align-items: center;
456
+ gap: 2px;
457
+ max-width: 80px;
458
+ flex-shrink: 0;
429
459
  }
430
460
 
431
- .ermis-channel-list__add-topic-btn {
461
+ .ermis-channel-list__topic-pill-avatar {
462
+ width: 16px;
463
+ height: 16px;
464
+ min-width: 16px;
432
465
  display: flex;
433
466
  align-items: center;
434
467
  justify-content: center;
435
- width: 24px;
436
- height: 24px;
437
- border-radius: var(--ermis-radius-sm);
468
+ font-size: 0.7rem;
469
+ border-radius: var(--ermis-radius-full);
438
470
  background-color: transparent;
439
- color: var(--ermis-text-muted);
440
- border: none;
441
- cursor: pointer;
442
- transition: all var(--ermis-transition);
443
471
  }
444
472
 
445
- .ermis-channel-list__add-topic-btn:hover {
446
- background-color: var(--ermis-bg-primary);
447
- color: var(--ermis-accent);
473
+ .ermis-channel-list__topic-pill-name {
474
+ font-size: var(--ermis-font-size-xs);
475
+ color: var(--ermis-text-muted);
476
+ white-space: nowrap;
477
+ overflow: hidden;
478
+ text-overflow: ellipsis;
479
+ max-width: 60px;
448
480
  }
449
481
 
450
- .ermis-channel-list__topic-header--expanded .ermis-channel-list__accordion-icon {
451
- transform: rotate(0deg);
482
+ .ermis-channel-list__topic-overflow {
483
+ font-size: var(--ermis-font-size-xs);
484
+ color: var(--ermis-text-muted);
485
+ flex-shrink: 0;
486
+ font-weight: 600;
452
487
  }
453
488
 
454
- .ermis-channel-list__topic-sublist {
489
+ /* --- Topics Row (third row in FlatTopicGroupItem) --- */
490
+ .ermis-channel-list__item-topics-row {
455
491
  display: flex;
456
- flex-direction: column;
457
- background-color: var(--ermis-bg-secondary);
492
+ align-items: center;
493
+ gap: var(--ermis-spacing-xs);
494
+ margin-top: 2px;
458
495
  }
459
496
 
460
- /* Indent nested items and provide hierarchical line */
461
- .ermis-channel-list__topic-sublist .ermis-channel-list__item {
462
- padding-left: var(--ermis-spacing-md);
463
- margin-left: 20px;
464
- border-left: 2px solid var(--ermis-border);
497
+ /* --- Error Indicator --- */
498
+ .ermis-channel-list__error {
499
+ display: flex;
500
+ flex-direction: column;
501
+ align-items: center;
502
+ justify-content: center;
503
+ padding: var(--ermis-spacing-xl, 32px) var(--ermis-spacing-lg);
504
+ text-align: center;
505
+ height: 100%;
465
506
  }
466
507
 
467
- .ermis-channel-list__topic-sublist .ermis-channel-list__item:hover {
468
- border-left-color: var(--ermis-border-hover);
508
+ .ermis-channel-list__error-icon {
509
+ color: var(--ermis-color-danger, #ef4444);
510
+ margin-bottom: var(--ermis-spacing-md);
511
+ opacity: 0.8;
469
512
  }
470
513
 
471
- .ermis-channel-list__topic-sublist .ermis-channel-list__item--active {
472
- border-left-color: var(--ermis-accent);
514
+ .ermis-channel-list__error-text {
515
+ font-size: var(--ermis-font-size-sm);
516
+ color: var(--ermis-text-primary);
517
+ font-weight: 500;
518
+ margin-bottom: var(--ermis-spacing-lg);
519
+ max-width: 220px;
520
+ line-height: 1.5;
473
521
  }
474
522
 
475
- .ermis-channel-list__topic-hashtag {
476
- display: flex;
523
+ .ermis-channel-list__error-retry {
524
+ display: inline-flex;
477
525
  align-items: center;
478
526
  justify-content: center;
479
- width: 24px;
480
- height: 24px;
481
- background-color: transparent;
482
- color: var(--ermis-text-muted);
483
- border-radius: var(--ermis-radius-full);
484
- font-size: 0.95rem;
527
+ padding: var(--ermis-spacing-sm, 8px) var(--ermis-spacing-lg, 16px);
528
+ background-color: var(--ermis-bg-primary, #fff);
529
+ color: var(--ermis-text-primary, #111);
530
+ border: 1px solid var(--ermis-border, #e5e7eb);
531
+ border-radius: var(--ermis-radius-md, 8px);
532
+ font-size: var(--ermis-font-size-sm);
485
533
  font-weight: 600;
486
- flex-shrink: 0;
534
+ cursor: pointer;
535
+ transition: all var(--ermis-transition, 0.2s ease);
487
536
  }
537
+
538
+ .ermis-channel-list__error-retry:hover {
539
+ background-color: var(--ermis-bg-hover, #f3f4f6);
540
+ border-color: var(--ermis-accent);
541
+ color: var(--ermis-accent);
542
+ }
543
+
544
+ .ermis-channel-list__error-retry svg {
545
+ transition: transform 0.5s ease;
546
+ }
547
+
548
+ .ermis-channel-list__error-retry:hover svg {
549
+ transform: rotate(180deg);
550
+ }
@@ -121,8 +121,18 @@
121
121
  /* User Picker Wrap */
122
122
  .ermis-create-channel__users {
123
123
  margin-top: var(--ermis-spacing-sm, 0.5rem);
124
+ display: flex;
125
+ flex-direction: column;
124
126
  }
125
127
 
128
+ /* .ermis-create-channel__users--team {
129
+ height: 280px;
130
+ }
131
+
132
+ .ermis-create-channel__users--messaging {
133
+ height: 400px;
134
+ } */
135
+
126
136
  .ermis-create-channel__users-title {
127
137
  font-size: var(--ermis-font-size-sm, 0.875rem);
128
138
  font-weight: 500;
@@ -89,8 +89,14 @@
89
89
  background: var(--ermis-bg-active);
90
90
  }
91
91
 
92
- .ermis-forward-modal__channel-name {
92
+ .ermis-forward-modal__channel-name-container {
93
93
  flex: 1;
94
+ display: flex;
95
+ flex-direction: column;
96
+ overflow: hidden;
97
+ }
98
+
99
+ .ermis-forward-modal__channel-name {
94
100
  font-size: var(--ermis-font-size-sm);
95
101
  color: var(--ermis-text-primary);
96
102
  overflow: hidden;
@@ -98,6 +104,15 @@
98
104
  white-space: nowrap;
99
105
  }
100
106
 
107
+ .ermis-forward-modal__channel-parent-name {
108
+ font-size: var(--ermis-font-size-xs);
109
+ color: var(--ermis-text-muted);
110
+ overflow: hidden;
111
+ text-overflow: ellipsis;
112
+ white-space: nowrap;
113
+ margin-bottom: 2px;
114
+ }
115
+
101
116
  /* Checkbox */
102
117
  .ermis-forward-modal__checkbox {
103
118
  width: 20px;
@@ -23,8 +23,12 @@
23
23
  }
24
24
 
25
25
  @keyframes ermis-lightbox-fade-in {
26
- from { opacity: 0; }
27
- to { opacity: 1; }
26
+ from {
27
+ opacity: 0;
28
+ }
29
+ to {
30
+ opacity: 1;
31
+ }
28
32
  }
29
33
 
30
34
  /* ----------------------------------------------------------
@@ -74,6 +78,11 @@
74
78
  color: #fff;
75
79
  }
76
80
 
81
+ .ermis-lightbox__action-btn:disabled {
82
+ opacity: 0.4;
83
+ cursor: not-allowed;
84
+ }
85
+
77
86
  /* ----------------------------------------------------------
78
87
  Content area
79
88
  ---------------------------------------------------------- */
@@ -120,6 +129,13 @@
120
129
  /* ----------------------------------------------------------
121
130
  Video
122
131
  ---------------------------------------------------------- */
132
+ .ermis-lightbox__video-wrapper {
133
+ position: relative;
134
+ display: flex;
135
+ align-items: center;
136
+ justify-content: center;
137
+ }
138
+
123
139
  .ermis-lightbox__video {
124
140
  max-width: 90vw;
125
141
  max-height: 80vh;
@@ -129,6 +145,55 @@
129
145
  animation: ermis-lightbox-zoom-in 0.25s cubic-bezier(0.16, 1, 0.3, 1);
130
146
  }
131
147
 
148
+ /* Retry overlay + spinner shown when video fails to load (CDN not ready) */
149
+ .ermis-lightbox__video-retry {
150
+ position: absolute;
151
+ inset: 0;
152
+ display: flex;
153
+ align-items: center;
154
+ justify-content: center;
155
+ background: rgba(0, 0, 0, 0.5);
156
+ border-radius: 4px;
157
+ pointer-events: none;
158
+ }
159
+
160
+ .ermis-lightbox__video-spinner {
161
+ width: 36px;
162
+ height: 36px;
163
+ border: 3px solid rgba(255, 255, 255, 0.2);
164
+ border-top-color: #fff;
165
+ border-radius: 50%;
166
+ animation: ermis-lightbox-spin 0.8s linear infinite;
167
+ }
168
+
169
+ .ermis-lightbox__video-retry {
170
+ flex-direction: column;
171
+ gap: 10px;
172
+ }
173
+
174
+ .ermis-lightbox__progress-label {
175
+ color: rgba(255, 255, 255, 0.86);
176
+ font-size: 13px;
177
+ font-weight: 500;
178
+ }
179
+
180
+ .ermis-lightbox__media-placeholder {
181
+ width: min(80vw, 720px);
182
+ height: min(60vh, 420px);
183
+ border-radius: 4px;
184
+ background: rgba(255, 255, 255, 0.08);
185
+ }
186
+
187
+ .ermis-lightbox__image--poster {
188
+ filter: none;
189
+ }
190
+
191
+ @keyframes ermis-lightbox-spin {
192
+ to {
193
+ transform: rotate(360deg);
194
+ }
195
+ }
196
+
132
197
  /* ----------------------------------------------------------
133
198
  Navigation buttons
134
199
  ---------------------------------------------------------- */
@@ -75,7 +75,7 @@
75
75
 
76
76
  .ermis-mention-suggestions__item:hover,
77
77
  .ermis-mention-suggestions__item--highlighted {
78
- background-color: var(--ermis-bg-secondary);
78
+ background-color: var(--ermis-bg-active);
79
79
  }
80
80
 
81
81
  .ermis-mention-suggestions__name {
@@ -27,12 +27,12 @@
27
27
 
28
28
  /* Position container for other (left) vs own (right) */
29
29
  .ermis-message-list__item--own .ermis-message-list__actions {
30
- right: 100%;
30
+ right: calc(100% + 12px);
31
31
  flex-direction: row-reverse;
32
32
  }
33
33
 
34
34
  .ermis-message-list__item--other .ermis-message-list__actions {
35
- left: 100%;
35
+ left: calc(100% + 12px);
36
36
  }
37
37
 
38
38
  /* Individual action buttons */
@@ -57,5 +57,4 @@
57
57
  .ermis-message-list__actions-trigger:hover:not(:disabled) {
58
58
  background-color: var(--ermis-bg-hover);
59
59
  color: var(--ermis-text-primary);
60
- }
61
-
60
+ }