@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
package/dist/index.css CHANGED
@@ -5,12 +5,13 @@
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;
11
12
  --ermis-text-primary: #e5e7eb;
12
- --ermis-text-secondary: #9ca3af;
13
- --ermis-text-muted: #6b7280;
13
+ --ermis-text-secondary: #abb4c6;
14
+ --ermis-text-muted: #abb4c6;
14
15
  --ermis-color-danger: #ef4444;
15
16
  --ermis-color-danger-hover: #dc2626;
16
17
  --ermis-color-success: #22c55e;
@@ -21,12 +22,14 @@
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:
31
+ "SF Pro Display",
32
+ "SF Pro Text",
30
33
  -apple-system,
31
34
  BlinkMacSystemFont,
32
35
  "Segoe UI",
@@ -72,27 +75,28 @@
72
75
  --ermis-bg-secondary: #f9fafb;
73
76
  --ermis-bg-hover: rgba(0, 0, 0, 0.04);
74
77
  --ermis-bg-active: rgba(99, 102, 241, 0.08);
78
+ --ermis-bg-overlay: rgba(255, 255, 255, 0.6);
75
79
  --ermis-border: rgba(0, 0, 0, 0.08);
76
- --ermis-accent: #6366f1;
77
- --ermis-accent-hover: #4f46e5;
80
+ --ermis-accent: #3436b6;
81
+ --ermis-accent-hover: #0d00ff;
78
82
  --ermis-text-primary: #111827;
79
83
  --ermis-text-secondary: #6b7280;
80
- --ermis-text-muted: #9ca3af;
84
+ --ermis-text-muted: #545f71;
81
85
  --ermis-color-danger: #ef4444;
82
86
  --ermis-color-danger-hover: #dc2626;
83
87
  --ermis-color-success: #10b981;
84
88
  --ermis-color-success-hover: #059669;
85
89
  --ermis-bubble-own-bg: var(--ermis-accent);
86
90
  --ermis-bubble-own-text: #ffffff;
87
- --ermis-bubble-other-bg: #f3f4f6;
91
+ --ermis-bubble-other-bg: #f0f2f5;
88
92
  --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);
93
+ --ermis-quote-other-bg: rgba(99, 102, 241, 0.06);
94
+ --ermis-quote-other-bg-hover: rgba(99, 102, 241, 0.12);
95
+ --ermis-quote-own-bg: rgba(255, 255, 255, 0.3);
96
+ --ermis-quote-own-bg-hover: rgba(255, 255, 255, 0.4);
97
+ --ermis-quote-own-border: rgba(255, 255, 255, 0.7);
98
+ --ermis-quote-own-author: #ffffff;
99
+ --ermis-quote-own-text: rgba(255, 255, 255, 0.85);
96
100
  --ermis-signal-success: #229A16;
97
101
  --ermis-signal-missed: #B72136;
98
102
  --ermis-signal-bg: rgba(0, 0, 0, 0.03);
@@ -129,11 +133,6 @@
129
133
  overflow: hidden;
130
134
  }
131
135
  .ermis-avatar--fallback {
132
- background:
133
- linear-gradient(
134
- 135deg,
135
- var(--ermis-accent) 0%,
136
- var(--ermis-accent-hover) 100%);
137
136
  color: #fff;
138
137
  font-weight: 600;
139
138
  font-family: var(--ermis-font-family);
@@ -280,8 +279,9 @@
280
279
  padding: 20px;
281
280
  display: flex;
282
281
  flex-direction: column;
283
- overflow: hidden;
282
+ overflow-y: auto;
284
283
  flex: 1;
284
+ min-height: 0;
285
285
  }
286
286
  .ermis-modal-footer {
287
287
  padding: 16px 20px;
@@ -356,10 +356,10 @@
356
356
  .ermis-channel-header {
357
357
  display: flex;
358
358
  align-items: center;
359
- gap: var(--ermis-spacing-md);
359
+ gap: var(--ermis-spacing-sm);
360
360
  padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
361
361
  border-bottom: 1px solid var(--ermis-border);
362
- background-color: var(--ermis-bg-secondary);
362
+ background-color: var(--ermis-bg-primary);
363
363
  font-family: var(--ermis-font-family);
364
364
  }
365
365
  .ermis-channel-header__info {
@@ -385,15 +385,15 @@
385
385
  text-overflow: ellipsis;
386
386
  }
387
387
  .ermis-channel-header__topic-avatar {
388
- width: 32px;
389
- height: 32px;
390
- min-width: 32px;
388
+ width: 44px;
389
+ height: 44px;
390
+ min-width: 44px;
391
391
  border-radius: var(--ermis-radius-md);
392
392
  background-color: var(--ermis-bg-primary);
393
393
  display: flex;
394
394
  align-items: center;
395
395
  justify-content: center;
396
- font-size: 16px;
396
+ font-size: 24px;
397
397
  color: var(--ermis-text-secondary);
398
398
  }
399
399
  .ermis-channel-header__subtitle {
@@ -463,7 +463,7 @@
463
463
  display: flex;
464
464
  align-items: center;
465
465
  gap: var(--ermis-spacing-md);
466
- padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
466
+ padding: calc(var(--ermis-spacing-md) - 0.05rem) var(--ermis-spacing-lg);
467
467
  cursor: pointer;
468
468
  border-left: 2px solid transparent;
469
469
  transition: background-color var(--ermis-transition), border-color var(--ermis-transition);
@@ -502,6 +502,29 @@
502
502
  .ermis-channel-list__online-dot--offline {
503
503
  background-color: var(--ermis-text-muted);
504
504
  }
505
+ .ermis-channel-list__avatar-unread-badge {
506
+ display: none;
507
+ position: absolute;
508
+ top: -2px;
509
+ right: -2px;
510
+ min-width: 16px;
511
+ height: 16px;
512
+ padding: 0 4px;
513
+ border-radius: var(--ermis-radius-full);
514
+ background-color: var(--ermis-color-danger, #ef4444);
515
+ color: #fff;
516
+ font-size: 9px;
517
+ font-weight: 700;
518
+ line-height: 1;
519
+ border: 1.5px solid var(--ermis-bg-primary);
520
+ z-index: 2;
521
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
522
+ }
523
+ .channel-sidebar-collapsed .ermis-channel-list__avatar-unread-badge {
524
+ display: flex;
525
+ align-items: center;
526
+ justify-content: center;
527
+ }
505
528
  .ermis-channel-list__item-top-row {
506
529
  display: flex;
507
530
  align-items: baseline;
@@ -516,7 +539,7 @@
516
539
  margin-top: 2px;
517
540
  }
518
541
  .ermis-channel-list__item-name {
519
- font-size: var(--ermis-font-size-sm);
542
+ font-size: calc(var(--ermis-font-size-sm) + 1px);
520
543
  font-weight: 500;
521
544
  color: var(--ermis-text-primary);
522
545
  white-space: nowrap;
@@ -532,7 +555,7 @@
532
555
  margin-top: 2px;
533
556
  }
534
557
  .ermis-channel-list__item-last-message {
535
- font-size: var(--ermis-font-size-xs);
558
+ font-size: calc(var(--ermis-font-size-sm));
536
559
  color: var(--ermis-text-muted);
537
560
  white-space: nowrap;
538
561
  overflow: hidden;
@@ -560,7 +583,7 @@
560
583
  }
561
584
  .ermis-channel-list__pinned-icon {
562
585
  position: absolute;
563
- top: -5px;
586
+ top: 0px;
564
587
  right: 0px;
565
588
  color: var(--ermis-color-danger, #ef4444);
566
589
  display: inline-flex;
@@ -577,6 +600,9 @@
577
600
  .ermis-channel-list__item-last-message-user {
578
601
  color: var(--ermis-text-secondary);
579
602
  }
603
+ .ermis-channel-list__item-last-message-source {
604
+ color: var(--ermis-text-secondary);
605
+ }
580
606
  .ermis-channel-list__item-actions-wrapper,
581
607
  .ermis-channel-list__topic-actions-wrapper {
582
608
  position: absolute;
@@ -614,12 +640,11 @@
614
640
  color: var(--ermis-accent);
615
641
  }
616
642
  .ermis-channel-list__item--unread .ermis-channel-list__item-name {
617
- font-weight: 700;
643
+ font-weight: 600;
618
644
  color: var(--ermis-text-primary);
619
645
  }
620
646
  .ermis-channel-list__item--unread .ermis-channel-list__item-last-message {
621
647
  color: var(--ermis-text-secondary);
622
- font-weight: 600;
623
648
  }
624
649
  .ermis-channel-list__unread-badge {
625
650
  display: inline-flex;
@@ -690,80 +715,111 @@
690
715
  .ermis-channel-list__accordion-icon--expanded {
691
716
  transform: rotate(0deg);
692
717
  }
693
- .ermis-channel-list__topic-group {
718
+ .ermis-channel-list__topic-hashtag {
694
719
  display: flex;
695
- flex-direction: column;
720
+ align-items: center;
721
+ justify-content: center;
722
+ width: 24px;
723
+ height: 24px;
724
+ background-color: transparent;
725
+ color: var(--ermis-text-muted);
726
+ border-radius: var(--ermis-radius-full);
727
+ font-size: 0.95rem;
728
+ font-weight: 600;
729
+ flex-shrink: 0;
696
730
  }
697
- .ermis-channel-list__topic-header {
731
+ .ermis-channel-list__topic-pills {
698
732
  display: flex;
699
733
  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;
734
+ gap: var(--ermis-spacing-xs);
717
735
  flex: 1;
736
+ min-width: 0;
737
+ overflow: hidden;
718
738
  }
719
- .ermis-channel-list__add-topic-btn {
739
+ .ermis-channel-list__topic-pill {
740
+ display: inline-flex;
741
+ align-items: center;
742
+ gap: 2px;
743
+ max-width: 80px;
744
+ flex-shrink: 0;
745
+ }
746
+ .ermis-channel-list__topic-pill-avatar {
747
+ width: 16px;
748
+ height: 16px;
749
+ min-width: 16px;
720
750
  display: flex;
721
751
  align-items: center;
722
752
  justify-content: center;
723
- width: 24px;
724
- height: 24px;
725
- border-radius: var(--ermis-radius-sm);
753
+ font-size: 0.7rem;
754
+ border-radius: var(--ermis-radius-full);
726
755
  background-color: transparent;
756
+ }
757
+ .ermis-channel-list__topic-pill-name {
758
+ font-size: var(--ermis-font-size-xs);
727
759
  color: var(--ermis-text-muted);
728
- border: none;
729
- cursor: pointer;
730
- transition: all var(--ermis-transition);
760
+ white-space: nowrap;
761
+ overflow: hidden;
762
+ text-overflow: ellipsis;
763
+ max-width: 60px;
731
764
  }
732
- .ermis-channel-list__add-topic-btn:hover {
733
- background-color: var(--ermis-bg-primary);
734
- color: var(--ermis-accent);
765
+ .ermis-channel-list__topic-overflow {
766
+ font-size: var(--ermis-font-size-xs);
767
+ color: var(--ermis-text-muted);
768
+ flex-shrink: 0;
769
+ font-weight: 600;
735
770
  }
736
- .ermis-channel-list__topic-header--expanded .ermis-channel-list__accordion-icon {
737
- transform: rotate(0deg);
771
+ .ermis-channel-list__item-topics-row {
772
+ display: flex;
773
+ align-items: center;
774
+ gap: var(--ermis-spacing-xs);
775
+ margin-top: 2px;
738
776
  }
739
- .ermis-channel-list__topic-sublist {
777
+ .ermis-channel-list__error {
740
778
  display: flex;
741
779
  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);
780
+ align-items: center;
781
+ justify-content: center;
782
+ padding: var(--ermis-spacing-xl, 32px) var(--ermis-spacing-lg);
783
+ text-align: center;
784
+ height: 100%;
748
785
  }
749
- .ermis-channel-list__topic-sublist .ermis-channel-list__item:hover {
750
- border-left-color: var(--ermis-border-hover);
786
+ .ermis-channel-list__error-icon {
787
+ color: var(--ermis-color-danger, #ef4444);
788
+ margin-bottom: var(--ermis-spacing-md);
789
+ opacity: 0.8;
751
790
  }
752
- .ermis-channel-list__topic-sublist .ermis-channel-list__item--active {
753
- border-left-color: var(--ermis-accent);
791
+ .ermis-channel-list__error-text {
792
+ font-size: var(--ermis-font-size-sm);
793
+ color: var(--ermis-text-primary);
794
+ font-weight: 500;
795
+ margin-bottom: var(--ermis-spacing-lg);
796
+ max-width: 220px;
797
+ line-height: 1.5;
754
798
  }
755
- .ermis-channel-list__topic-hashtag {
756
- display: flex;
799
+ .ermis-channel-list__error-retry {
800
+ display: inline-flex;
757
801
  align-items: center;
758
802
  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;
803
+ padding: var(--ermis-spacing-sm, 8px) var(--ermis-spacing-lg, 16px);
804
+ background-color: var(--ermis-bg-primary, #fff);
805
+ color: var(--ermis-text-primary, #111);
806
+ border: 1px solid var(--ermis-border, #e5e7eb);
807
+ border-radius: var(--ermis-radius-md, 8px);
808
+ font-size: var(--ermis-font-size-sm);
765
809
  font-weight: 600;
766
- flex-shrink: 0;
810
+ cursor: pointer;
811
+ transition: all var(--ermis-transition, 0.2s ease);
812
+ }
813
+ .ermis-channel-list__error-retry:hover {
814
+ background-color: var(--ermis-bg-hover, #f3f4f6);
815
+ border-color: var(--ermis-accent);
816
+ color: var(--ermis-accent);
817
+ }
818
+ .ermis-channel-list__error-retry svg {
819
+ transition: transform 0.5s ease;
820
+ }
821
+ .ermis-channel-list__error-retry:hover svg {
822
+ transform: rotate(180deg);
767
823
  }
768
824
 
769
825
  /* src/styles/_message-list.css */
@@ -787,17 +843,24 @@
787
843
  display: flex;
788
844
  flex-direction: column;
789
845
  flex: 1;
846
+ min-height: 0;
847
+ overflow: hidden;
790
848
  font-family: var(--ermis-font-family);
791
- gap: var(--ermis-spacing-xs);
792
849
  position: relative;
793
850
  }
794
851
  .ermis-message-list__vlist {
795
852
  display: flex !important;
796
853
  flex-direction: column !important;
797
- padding-left: 3rem;
798
- padding-right: 3rem;
799
- padding-top: var(--ermis-spacing-lg);
800
- padding-bottom: var(--ermis-spacing-lg);
854
+ flex: 1;
855
+ min-height: 0;
856
+ overflow-anchor: none;
857
+ padding-left: 1rem;
858
+ padding-right: 1rem;
859
+ padding-top: 1rem;
860
+ padding-bottom: 0.5rem;
861
+ }
862
+ .ermis-message-list__vlist * {
863
+ overflow-anchor: none;
801
864
  }
802
865
  .ermis-message-list__vlist > div {
803
866
  margin-top: auto;
@@ -841,22 +904,38 @@
841
904
  .ermis-message-list__date-separator {
842
905
  display: flex;
843
906
  align-items: center;
844
- gap: var(--ermis-spacing-md);
907
+ justify-content: center;
845
908
  padding: var(--ermis-spacing-md) 0;
846
909
  margin: var(--ermis-spacing-xs) 0;
847
910
  align-self: stretch;
848
911
  }
849
912
  .ermis-message-list__date-separator-line {
850
- flex: 1;
851
- height: 1px;
852
- background-color: var(--ermis-border);
913
+ display: none;
853
914
  }
854
915
  .ermis-message-list__date-separator-label {
855
- font-size: var(--ermis-font-size-xs);
856
- color: var(--ermis-text-muted);
916
+ font-size: 11px;
917
+ color: #fff;
918
+ background-color: rgba(0, 0, 0, 0.3);
919
+ padding: 4px 12px;
920
+ border-radius: 12px;
857
921
  white-space: nowrap;
858
922
  font-weight: 500;
859
923
  }
924
+ .ermis-message-list__time-separator {
925
+ display: flex;
926
+ align-items: center;
927
+ justify-content: center;
928
+ padding: var(--ermis-spacing-xs) 0;
929
+ margin: var(--ermis-spacing-xs) 0;
930
+ align-self: stretch;
931
+ }
932
+ .ermis-message-list__time-separator-label {
933
+ font-size: 10px;
934
+ color: var(--ermis-text-muted);
935
+ padding: 2px 10px;
936
+ white-space: nowrap;
937
+ font-weight: 400;
938
+ }
860
939
  .ermis-message-list__empty {
861
940
  display: flex;
862
941
  flex-direction: column;
@@ -883,16 +962,44 @@
883
962
  font-size: var(--ermis-font-size-sm);
884
963
  color: var(--ermis-text-muted);
885
964
  }
965
+ .ermis-message-group {
966
+ display: flex;
967
+ align-items: flex-end;
968
+ gap: var(--ermis-spacing-sm);
969
+ width: 100%;
970
+ padding-top: 4px;
971
+ }
972
+ .ermis-message-group--own {
973
+ flex-direction: row-reverse;
974
+ }
975
+ .ermis-message-group--other {
976
+ flex-direction: row;
977
+ }
978
+ .ermis-message-group__avatar-col {
979
+ flex-shrink: 0;
980
+ position: sticky;
981
+ bottom: 0;
982
+ align-self: flex-end;
983
+ z-index: 5;
984
+ }
985
+ .ermis-message-group__messages-col {
986
+ display: flex;
987
+ flex-direction: column;
988
+ min-width: 0;
989
+ max-width: 75%;
990
+ }
886
991
  .ermis-message-list__item {
887
992
  display: flex;
888
- align-items: flex-start;
993
+ align-items: flex-end;
889
994
  gap: var(--ermis-spacing-sm);
890
995
  width: 100%;
891
996
  }
892
- .ermis-message-list__item--group-start {
893
- padding-top: var(--ermis-spacing-md);
997
+ .ermis-message-list__item--group-single,
998
+ .ermis-message-list__item--group-top {
999
+ padding-top: 0;
894
1000
  }
895
- .ermis-message-list__item--group-cont {
1001
+ .ermis-message-list__item--group-middle,
1002
+ .ermis-message-list__item--group-bottom {
896
1003
  padding-top: 2px;
897
1004
  }
898
1005
  .ermis-message-list__item--other {
@@ -943,6 +1050,15 @@
943
1050
  .ermis-message--error .ermis-message-bubble {
944
1051
  border: 1px solid #e74c3c;
945
1052
  }
1053
+ .ermis-message-list__deleted-text {
1054
+ display: inline-flex;
1055
+ align-items: center;
1056
+ gap: 6px;
1057
+ font-style: italic;
1058
+ font-size: var(--ermis-font-size-sm);
1059
+ user-select: none;
1060
+ opacity: 0.5;
1061
+ }
946
1062
  .ermis-message-list__pinned-indicator {
947
1063
  position: absolute;
948
1064
  top: -5px;
@@ -1169,30 +1285,28 @@
1169
1285
  padding: var(--ermis-spacing-xs) var(--ermis-spacing-sm);
1170
1286
  border-left: 3px solid var(--ermis-accent);
1171
1287
  background-color: var(--ermis-quote-other-bg);
1172
- border-radius: 0 var(--ermis-radius-sm) var(--ermis-radius-sm) 0;
1288
+ border-radius: var(--ermis-radius-sm);
1173
1289
  cursor: pointer;
1174
1290
  max-width: 100%;
1175
1291
  transition: background-color 0.15s;
1176
- margin-top: var(--ermis-spacing-sm);
1177
1292
  }
1178
1293
  .ermis-quoted-message:hover {
1179
1294
  background-color: var(--ermis-quote-other-bg-hover);
1180
1295
  }
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);
1296
+ .ermis-quoted-message--unavailable {
1297
+ border-left-color: var(--ermis-text-muted);
1298
+ background-color: var(--ermis-bg-hover);
1185
1299
  }
1186
- .ermis-quoted-message--own:hover {
1187
- background-color: var(--ermis-quote-own-bg-hover);
1300
+ .ermis-quoted-message--unavailable:hover {
1301
+ background-color: var(--ermis-bg-hover);
1188
1302
  }
1189
1303
  .ermis-quoted-message__author {
1190
1304
  font-size: var(--ermis-font-size-xs);
1191
1305
  font-weight: 600;
1192
1306
  color: var(--ermis-accent);
1193
1307
  }
1194
- .ermis-quoted-message--own .ermis-quoted-message__author {
1195
- color: var(--ermis-quote-own-author);
1308
+ .ermis-quoted-message--unavailable .ermis-quoted-message__author {
1309
+ color: var(--ermis-text-muted);
1196
1310
  }
1197
1311
  .ermis-quoted-message__text {
1198
1312
  font-size: var(--ermis-font-size-xs);
@@ -1201,17 +1315,20 @@
1201
1315
  text-overflow: ellipsis;
1202
1316
  white-space: nowrap;
1203
1317
  }
1204
- .ermis-quoted-message--own .ermis-quoted-message__text {
1205
- color: var(--ermis-quote-own-text);
1318
+ .ermis-quoted-message--unavailable .ermis-quoted-message__text {
1319
+ font-style: italic;
1206
1320
  }
1207
1321
  .ermis-message-list__item-avatar {
1208
1322
  flex-shrink: 0;
1323
+ position: sticky;
1324
+ bottom: 0;
1325
+ align-self: flex-end;
1209
1326
  }
1210
1327
  .ermis-message-list__item-content {
1211
1328
  display: flex;
1212
1329
  flex-direction: column;
1213
1330
  min-width: 0;
1214
- max-width: 75%;
1331
+ max-width: 100%;
1215
1332
  gap: 2px;
1216
1333
  }
1217
1334
  .ermis-message-list__item--own .ermis-message-list__item-content {
@@ -1219,36 +1336,46 @@
1219
1336
  }
1220
1337
  .ermis-message-list__bubble-wrapper {
1221
1338
  display: flex;
1222
- flex-wrap: wrap;
1223
- flex-direction: row;
1224
- align-items: center;
1339
+ flex-direction: column;
1340
+ align-items: flex-start;
1225
1341
  position: relative;
1226
1342
  width: 100%;
1227
1343
  }
1228
1344
  .ermis-message-list__item--own .ermis-message-list__bubble-wrapper {
1229
- flex-direction: row-reverse;
1345
+ align-items: flex-end;
1230
1346
  }
1231
1347
  .ermis-message-list__item-user {
1232
- font-size: var(--ermis-font-size-xs);
1348
+ font-size: var(--ermis-font-size-sm);
1233
1349
  font-weight: 600;
1234
1350
  color: var(--ermis-accent);
1235
1351
  margin-bottom: 1px;
1236
1352
  }
1353
+ .ermis-message-list__item-user--clickable {
1354
+ cursor: pointer;
1355
+ transition: opacity 0.2s;
1356
+ }
1357
+ .ermis-message-list__item-user--clickable:hover {
1358
+ opacity: 0.7;
1359
+ }
1237
1360
  .ermis-message-list__item-time {
1238
- font-size: 0.625rem;
1361
+ font-size: 0.6875rem;
1239
1362
  color: var(--ermis-text-muted);
1240
- margin-left: auto;
1241
- padding-left: var(--ermis-spacing-md);
1242
1363
  white-space: nowrap;
1243
1364
  line-height: 1;
1244
- align-self: flex-end;
1245
- padding-top: 4px;
1246
- width: 100%;
1247
- text-align: right;
1248
1365
  display: inline-flex;
1249
1366
  align-items: center;
1250
- justify-content: flex-end;
1251
- gap: 3px;
1367
+ gap: 2px;
1368
+ float: right;
1369
+ margin-left: 6px;
1370
+ margin-top: 4px;
1371
+ position: relative;
1372
+ }
1373
+ .ermis-message-list__item-time ~ .ermis-message-list__item-text::after,
1374
+ .ermis-message-list__item-time ~ * .ermis-message-list__item-text::after {
1375
+ content: "";
1376
+ display: inline-block;
1377
+ width: 15px;
1378
+ height: 0;
1252
1379
  }
1253
1380
  .ermis-message-list__edited-indicator {
1254
1381
  margin-right: 2px;
@@ -1278,23 +1405,73 @@
1278
1405
  .ermis-message-status-icon--failed {
1279
1406
  color: var(--ermis-color-danger);
1280
1407
  }
1281
- .ermis-message-bubble--own .ermis-message-list__item-time {
1282
- color: rgba(255, 255, 255, 0.6);
1408
+ .ermis-attachment-upload-overlay {
1409
+ position: absolute;
1410
+ inset: 0;
1411
+ z-index: 3;
1412
+ display: inline-flex;
1413
+ flex-direction: column;
1414
+ align-items: center;
1415
+ justify-content: center;
1416
+ gap: 6px;
1417
+ color: #fff;
1418
+ font-size: 12px;
1419
+ font-weight: 700;
1420
+ line-height: 1;
1421
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.36);
1422
+ background: rgba(17, 24, 39, 0.34);
1423
+ pointer-events: none;
1283
1424
  }
1284
- .ermis-message-list__item-text {
1285
- font-size: var(--ermis-font-size-sm);
1286
- line-height: 1.5;
1425
+ .ermis-voice-upload-wrap {
1426
+ position: relative;
1427
+ }
1428
+ .ermis-voice-upload-progress {
1429
+ position: absolute;
1430
+ top: -6px;
1431
+ right: -6px;
1432
+ min-width: 30px;
1433
+ padding: 3px 6px;
1434
+ border-radius: 999px;
1435
+ background: rgba(17, 24, 39, 0.72);
1436
+ color: #fff;
1437
+ font-size: 11px;
1438
+ font-weight: 700;
1439
+ line-height: 1;
1440
+ }
1441
+ .ermis-message-bubble--own .ermis-message-list__item-time {
1442
+ color: var(--ermis-bubble-own-text);
1443
+ opacity: 0.6;
1444
+ }
1445
+ .ermis-message-bubble--own .ermis-message-list__item-time ~ .ermis-message-list__item-text::after,
1446
+ .ermis-message-bubble--own .ermis-message-list__item-time ~ * .ermis-message-list__item-text::after {
1447
+ width: 30px;
1448
+ }
1449
+ .ermis-message-list__item-text {
1450
+ font-size: var(--ermis-font-size-sm);
1451
+ line-height: 1.5;
1287
1452
  word-break: break-word;
1453
+ white-space: pre-wrap;
1288
1454
  }
1289
1455
  .ermis-mention {
1290
1456
  color: var(--ermis-accent);
1291
1457
  font-weight: 600;
1458
+ cursor: default;
1459
+ background-color: rgba(0, 122, 255, 0.1);
1460
+ padding: 2px 6px;
1461
+ border-radius: 4px;
1462
+ margin: 0 1px;
1463
+ }
1464
+ .ermis-mention--clickable {
1292
1465
  cursor: pointer;
1466
+ transition: opacity 0.2s;
1467
+ }
1468
+ .ermis-mention--clickable:hover {
1469
+ opacity: 0.8;
1293
1470
  }
1294
1471
  .ermis-message-bubble--own .ermis-mention {
1295
1472
  color: rgba(255, 255, 255, 0.9);
1296
- text-decoration: underline;
1297
- text-underline-offset: 2px;
1473
+ background-color: rgba(255, 255, 255, 0.2);
1474
+ text-decoration: none;
1298
1475
  }
1299
1476
  .ermis-text-link {
1300
1477
  color: var(--ermis-accent);
@@ -1307,43 +1484,112 @@
1307
1484
  opacity: 0.8;
1308
1485
  }
1309
1486
  .ermis-message-bubble--own .ermis-text-link {
1310
- color: rgba(255, 255, 255, 0.9);
1487
+ color: var(--ermis-bubble-own-text);
1488
+ text-decoration: underline;
1311
1489
  }
1312
1490
  .ermis-message-bubble--own .ermis-attachment__link-title {
1313
- color: rgba(255, 255, 255, 0.9);
1491
+ color: var(--ermis-bubble-own-text);
1314
1492
  }
1315
1493
  .ermis-message-bubble {
1316
1494
  position: relative;
1317
- display: flex;
1318
- flex-wrap: wrap;
1319
- align-items: flex-end;
1320
- padding: var(--ermis-spacing-sm) var(--ermis-spacing-md);
1495
+ display: flow-root;
1496
+ padding: 8px 10px;
1321
1497
  border-radius: var(--ermis-radius-lg);
1322
1498
  word-break: break-word;
1499
+ overflow: visible;
1323
1500
  }
1324
1501
  .ermis-message-bubble--own {
1325
1502
  background-color: var(--ermis-bubble-own-bg);
1326
1503
  color: var(--ermis-bubble-own-text);
1327
- border-bottom-right-radius: var(--ermis-radius-sm);
1504
+ border-color: var(--ermis-bubble-own-bg);
1505
+ }
1506
+ .ermis-message-bubble--own ::selection {
1507
+ background-color: rgba(255, 255, 255, 0.9);
1508
+ color: #111827;
1509
+ }
1510
+ .ermis-message-bubble--own::selection {
1511
+ background-color: rgba(255, 255, 255, 0.9);
1512
+ color: #111827;
1328
1513
  }
1329
1514
  .ermis-message-bubble--own .ermis-attachment__file-size,
1330
1515
  .ermis-message-bubble--own .ermis-attachment__link-url,
1331
1516
  .ermis-message-bubble--own .ermis-attachment__link-description,
1332
1517
  .ermis-message-bubble--own .ermis-attachment__voice-duration,
1333
- .ermis-message-bubble--own .ermis-message-list__forwarded-indicator,
1334
- .ermis-message-bubble--own .ermis-attachment--file {
1335
- color: rgba(255, 255, 255, 0.6);
1518
+ .ermis-message-bubble--own .ermis-message-list__forwarded-indicator {
1519
+ color: var(--ermis-bubble-own-text);
1520
+ opacity: 0.8;
1336
1521
  }
1337
1522
  .ermis-message-bubble--own .ermis-attachment--link-preview {
1338
- border-color: rgba(255, 255, 255, 0.2);
1523
+ border-color: color-mix(in srgb, var(--ermis-bubble-own-text) 30%, transparent);
1339
1524
  }
1340
1525
  .ermis-message-bubble--own .ermis-attachment--file {
1341
- background-color: rgba(255, 255, 255, 0.1);
1526
+ background-color: color-mix(in srgb, var(--ermis-bubble-own-text) 10%, transparent);
1527
+ color: var(--ermis-bubble-own-text);
1342
1528
  }
1343
1529
  .ermis-message-bubble--other {
1344
1530
  background-color: var(--ermis-bubble-other-bg);
1345
1531
  color: var(--ermis-bubble-other-text);
1346
- border-bottom-left-radius: var(--ermis-radius-sm);
1532
+ }
1533
+ .ermis-message-list__item--own.ermis-message-list__item--group-top .ermis-message-bubble {
1534
+ border-bottom-right-radius: 4px;
1535
+ }
1536
+ .ermis-message-list__item--own.ermis-message-list__item--group-middle .ermis-message-bubble {
1537
+ border-top-right-radius: 4px;
1538
+ border-bottom-right-radius: 4px;
1539
+ }
1540
+ .ermis-message-list__item--own.ermis-message-list__item--group-bottom .ermis-message-bubble {
1541
+ border-top-right-radius: 4px;
1542
+ }
1543
+ .ermis-message-list__item--other.ermis-message-list__item--group-top .ermis-message-bubble {
1544
+ border-bottom-left-radius: 4px;
1545
+ }
1546
+ .ermis-message-list__item--other.ermis-message-list__item--group-middle .ermis-message-bubble {
1547
+ border-top-left-radius: 4px;
1548
+ border-bottom-left-radius: 4px;
1549
+ }
1550
+ .ermis-message-list__item--other.ermis-message-list__item--group-bottom .ermis-message-bubble {
1551
+ border-top-left-radius: 4px;
1552
+ border-bottom-left-radius: 0;
1553
+ }
1554
+ .ermis-message-list__item--other.ermis-message-list__item--group-bottom .ermis-message-bubble::after,
1555
+ .ermis-message-list__item--other.ermis-message-list__item--group-single .ermis-message-bubble::after {
1556
+ content: "";
1557
+ position: absolute;
1558
+ bottom: 0px;
1559
+ left: -9px;
1560
+ width: 9px;
1561
+ height: 17px;
1562
+ background-color: var(--ermis-bubble-other-bg);
1563
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='9' height='17' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z'/%3E%3C/svg%3E");
1564
+ mask-image: url("data:image/svg+xml,%3Csvg width='9' height='17' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z'/%3E%3C/svg%3E");
1565
+ -webkit-mask-size: 9px 17px;
1566
+ mask-size: 9px 17px;
1567
+ -webkit-mask-repeat: no-repeat;
1568
+ mask-repeat: no-repeat;
1569
+ }
1570
+ .ermis-message-list__item--own.ermis-message-list__item--group-bottom .ermis-message-bubble::after,
1571
+ .ermis-message-list__item--own.ermis-message-list__item--group-single .ermis-message-bubble::after {
1572
+ content: "";
1573
+ position: absolute;
1574
+ bottom: 0px;
1575
+ right: -9px;
1576
+ width: 9px;
1577
+ height: 17px;
1578
+ background-color: var(--ermis-bubble-own-bg);
1579
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='9' height='17' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 17H0V0c.193 2.84.876 5.767 2.05 8.782.904 2.325 2.446 4.485 4.625 6.48A1 1 0 016 17z'/%3E%3C/svg%3E");
1580
+ mask-image: url("data:image/svg+xml,%3Csvg width='9' height='17' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 17H0V0c.193 2.84.876 5.767 2.05 8.782.904 2.325 2.446 4.485 4.625 6.48A1 1 0 016 17z'/%3E%3C/svg%3E");
1581
+ -webkit-mask-size: 9px 17px;
1582
+ mask-size: 9px 17px;
1583
+ -webkit-mask-repeat: no-repeat;
1584
+ mask-repeat: no-repeat;
1585
+ }
1586
+ .ermis-message-list__item--other.ermis-message-list__item--group-bottom .ermis-message-bubble,
1587
+ .ermis-message-list__item--other.ermis-message-list__item--group-single .ermis-message-bubble {
1588
+ border-bottom-left-radius: 0;
1589
+ }
1590
+ .ermis-message-list__item--own.ermis-message-list__item--group-bottom .ermis-message-bubble,
1591
+ .ermis-message-list__item--own.ermis-message-list__item--group-single .ermis-message-bubble {
1592
+ border-bottom-right-radius: 0;
1347
1593
  }
1348
1594
  .ermis-message-list__system {
1349
1595
  display: flex;
@@ -1367,6 +1613,7 @@
1367
1613
  border-radius: var(--ermis-radius-md);
1368
1614
  background-color: var(--ermis-signal-bg);
1369
1615
  min-width: 180px;
1616
+ position: relative;
1370
1617
  }
1371
1618
  .ermis-signal-message__icon {
1372
1619
  display: flex;
@@ -1390,6 +1637,7 @@
1390
1637
  flex-direction: column;
1391
1638
  gap: 1px;
1392
1639
  min-width: 0;
1640
+ padding-right: 40px;
1393
1641
  }
1394
1642
  .ermis-signal-message__text {
1395
1643
  font-size: var(--ermis-font-size-sm);
@@ -1407,31 +1655,22 @@
1407
1655
  color: var(--ermis-text-muted);
1408
1656
  line-height: 1.3;
1409
1657
  }
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);
1658
+ .ermis-signal-message__time {
1659
+ position: absolute;
1660
+ bottom: 8px;
1661
+ right: 12px;
1662
+ font-size: 10px;
1663
+ color: var(--ermis-text-muted);
1664
+ line-height: 1;
1429
1665
  }
1430
- .ermis-message-bubble--own .ermis-signal-message__text--missed {
1431
- color: var(--ermis-signal-own-missed);
1666
+ .ermis-message-list__item--signal .ermis-message-bubble {
1667
+ background: transparent !important;
1668
+ box-shadow: none !important;
1669
+ padding: 0 !important;
1670
+ border: none !important;
1432
1671
  }
1433
- .ermis-message-bubble--own .ermis-signal-message__duration {
1434
- color: var(--ermis-signal-own-duration);
1672
+ .ermis-message-list__item--signal .ermis-message-bubble::after {
1673
+ display: none;
1435
1674
  }
1436
1675
  .ermis-message-list__item-content--has-attachments {
1437
1676
  width: 350px;
@@ -1439,10 +1678,22 @@
1439
1678
  .ermis-message-list__item-content--has-attachments .ermis-message-bubble {
1440
1679
  width: 100%;
1441
1680
  }
1681
+ .ermis-message-list__item-content--has-attachments:has(.ermis-message-content--with-e2ee-attachments) {
1682
+ width: fit-content;
1683
+ max-width: min(86vw, 350px);
1684
+ }
1685
+ .ermis-message-list__item-content--has-attachments:has(.ermis-message-content--with-e2ee-attachments) .ermis-message-bubble {
1686
+ width: auto;
1687
+ max-width: 100%;
1688
+ }
1442
1689
  .ermis-message-content--with-attachments {
1443
1690
  display: flex;
1444
1691
  flex-direction: column;
1445
1692
  width: 100%;
1693
+ max-width: 100%;
1694
+ }
1695
+ .ermis-message-content--with-e2ee-attachments {
1696
+ width: fit-content;
1446
1697
  }
1447
1698
  .ermis-message-content--with-attachments .ermis-message-list__item-text {
1448
1699
  word-wrap: break-word;
@@ -1454,6 +1705,10 @@
1454
1705
  gap: var(--ermis-spacing-xs);
1455
1706
  margin-top: var(--ermis-spacing-xs);
1456
1707
  width: 100%;
1708
+ max-width: 100%;
1709
+ }
1710
+ .ermis-message-content--with-e2ee-attachments .ermis-attachment-list {
1711
+ width: fit-content;
1457
1712
  }
1458
1713
  .ermis-attachment-grid {
1459
1714
  display: grid;
@@ -1661,49 +1916,263 @@
1661
1916
  background-color: var(--ermis-bg-active);
1662
1917
  color: var(--ermis-accent);
1663
1918
  }
1919
+ .ermis-attachment--e2ee {
1920
+ width: min(320px, calc(100vw - 96px));
1921
+ min-width: 220px;
1922
+ max-width: 320px;
1923
+ border: 1px solid color-mix(in srgb, var(--ermis-accent) 20%, transparent);
1924
+ }
1925
+ .ermis-e2ee-attachment__open {
1926
+ padding: 0;
1927
+ border: 0;
1928
+ background: transparent;
1929
+ color: inherit;
1930
+ text-align: left;
1931
+ cursor: pointer;
1932
+ }
1933
+ .ermis-e2ee-attachment__open:disabled,
1934
+ .ermis-attachment__file-download:disabled {
1935
+ cursor: wait;
1936
+ opacity: 0.6;
1937
+ }
1938
+ .ermis-e2ee-attachment-media {
1939
+ display: flex;
1940
+ flex-direction: column;
1941
+ gap: var(--ermis-spacing-xs);
1942
+ width: fit-content;
1943
+ max-width: min(100%, 340px);
1944
+ }
1945
+ .ermis-e2ee-attachment-media .ermis-attachment-aspect-box {
1946
+ max-width: 100%;
1947
+ }
1948
+ .ermis-e2ee-attachment-placeholder {
1949
+ padding: 0;
1950
+ border: 0;
1951
+ color: var(--ermis-text-primary);
1952
+ cursor: pointer;
1953
+ }
1954
+ .ermis-e2ee-attachment-placeholder:disabled {
1955
+ cursor: wait;
1956
+ }
1957
+ .ermis-e2ee-attachment-placeholder__center {
1958
+ position: absolute;
1959
+ inset: 0;
1960
+ z-index: 3;
1961
+ display: flex;
1962
+ flex-direction: column;
1963
+ align-items: center;
1964
+ justify-content: center;
1965
+ gap: 6px;
1966
+ padding: var(--ermis-spacing-md);
1967
+ text-align: center;
1968
+ }
1969
+ .ermis-e2ee-attachment-placeholder__icon {
1970
+ display: flex;
1971
+ align-items: center;
1972
+ justify-content: center;
1973
+ width: 44px;
1974
+ height: 44px;
1975
+ border-radius: var(--ermis-radius-full);
1976
+ background: color-mix(in srgb, var(--ermis-accent) 14%, var(--ermis-bg-secondary));
1977
+ color: var(--ermis-accent);
1978
+ }
1979
+ .ermis-e2ee-attachment-placeholder__title {
1980
+ max-width: 100%;
1981
+ overflow: hidden;
1982
+ color: var(--ermis-text-primary);
1983
+ font-size: var(--ermis-font-size-sm);
1984
+ font-weight: 600;
1985
+ text-overflow: ellipsis;
1986
+ white-space: nowrap;
1987
+ }
1988
+ .ermis-e2ee-attachment-placeholder__meta,
1989
+ .ermis-e2ee-attachment-actions__label {
1990
+ color: var(--ermis-text-muted);
1991
+ font-size: var(--ermis-font-size-xs);
1992
+ }
1993
+ .ermis-e2ee-attachment-actions {
1994
+ display: flex;
1995
+ align-items: center;
1996
+ justify-content: space-between;
1997
+ gap: var(--ermis-spacing-xs);
1998
+ width: 100%;
1999
+ min-width: 0;
2000
+ }
2001
+ .ermis-e2ee-attachment-actions__label {
2002
+ min-width: 0;
2003
+ overflow: hidden;
2004
+ text-overflow: ellipsis;
2005
+ white-space: nowrap;
2006
+ }
1664
2007
  .ermis-message-bubble--own .ermis-attachment__file-name {
1665
- color: rgba(255, 255, 255, 0.9);
2008
+ color: var(--ermis-bubble-own-text);
1666
2009
  }
1667
2010
  .ermis-message-bubble--own .ermis-attachment__file-icon {
1668
- background: rgba(255, 255, 255, 0.2);
1669
- color: #fff;
2011
+ background: color-mix(in srgb, var(--ermis-bubble-own-text) 20%, transparent);
2012
+ color: var(--ermis-bubble-own-text);
1670
2013
  }
1671
2014
  .ermis-message-bubble--own .ermis-attachment__file-ext {
1672
- color: rgba(255, 255, 255, 0.8);
2015
+ color: var(--ermis-bubble-own-text);
2016
+ opacity: 0.8;
1673
2017
  }
1674
2018
  .ermis-message-bubble--own .ermis-attachment__file-download {
1675
- color: rgba(255, 255, 255, 0.7);
2019
+ color: var(--ermis-bubble-own-text);
2020
+ opacity: 0.8;
1676
2021
  }
1677
2022
  .ermis-message-bubble--own .ermis-attachment__file-download:hover {
1678
- background-color: rgba(255, 255, 255, 0.15);
1679
- color: #fff;
2023
+ background-color: color-mix(in srgb, var(--ermis-bubble-own-text) 15%, transparent);
2024
+ color: inherit;
2025
+ }
2026
+ .ermis-message-bubble--own .ermis-attachment--e2ee {
2027
+ border-color: color-mix(in srgb, var(--ermis-bubble-own-text) 25%, transparent);
2028
+ }
2029
+ .ermis-message-bubble--own .ermis-e2ee-attachment-placeholder,
2030
+ .ermis-message-bubble--own .ermis-e2ee-attachment-placeholder__title {
2031
+ color: var(--ermis-bubble-own-text);
2032
+ }
2033
+ .ermis-message-bubble--own .ermis-e2ee-attachment-placeholder__meta,
2034
+ .ermis-message-bubble--own .ermis-e2ee-attachment-actions__label {
2035
+ color: var(--ermis-bubble-own-text);
2036
+ opacity: 0.8;
1680
2037
  }
1681
- .ermis-attachment--voice {
2038
+ .ermis-message-bubble--own .ermis-e2ee-attachment-placeholder__icon {
2039
+ background: color-mix(in srgb, var(--ermis-bubble-own-text) 20%, transparent);
2040
+ color: var(--ermis-bubble-own-text);
2041
+ }
2042
+ .ermis-custom-audio-player {
1682
2043
  display: flex;
1683
2044
  align-items: center;
1684
2045
  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;
2046
+ min-width: 240px;
1689
2047
  width: 100%;
1690
- box-sizing: border-box;
1691
2048
  }
1692
- .ermis-attachment__voice-icon {
1693
- font-size: 1.25rem;
2049
+ .ermis-e2ee-voice-attachment {
2050
+ width: min(320px, calc(100vw - 96px));
2051
+ max-width: 100%;
2052
+ }
2053
+ .ermis-e2ee-voice-attachment .ermis-custom-audio-player {
2054
+ width: min(320px, calc(100vw - 96px));
2055
+ min-width: 260px;
2056
+ max-width: 100%;
2057
+ }
2058
+ .ermis-custom-audio-player--placeholder {
2059
+ padding: 0;
2060
+ border: 0;
2061
+ background: transparent;
2062
+ color: inherit;
2063
+ cursor: pointer;
2064
+ }
2065
+ .ermis-custom-audio-player--placeholder:disabled {
2066
+ cursor: wait;
2067
+ }
2068
+ .ermis-custom-audio-play-btn {
2069
+ display: flex;
2070
+ align-items: center;
2071
+ justify-content: center;
2072
+ width: 36px;
2073
+ height: 36px;
2074
+ border-radius: 50%;
2075
+ background-color: var(--ermis-accent);
2076
+ border: none;
2077
+ cursor: pointer;
2078
+ color: white;
1694
2079
  flex-shrink: 0;
2080
+ transition: opacity 0.2s, transform 0.1s;
2081
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
2082
+ }
2083
+ .ermis-custom-audio-play-btn:hover {
2084
+ opacity: 0.9;
2085
+ }
2086
+ .ermis-custom-audio-play-btn:active {
2087
+ transform: scale(0.95);
1695
2088
  }
1696
- .ermis-attachment__voice-player {
2089
+ .ermis-message-bubble--own .ermis-custom-audio-play-btn {
2090
+ background-color: var(--ermis-bubble-own-text);
2091
+ color: var(--ermis-accent);
2092
+ }
2093
+ .ermis-custom-audio-progress-container {
1697
2094
  flex: 1;
1698
- min-width: 0;
2095
+ display: flex;
2096
+ align-items: center;
2097
+ height: 24px;
2098
+ padding: 0 6px;
2099
+ }
2100
+ .ermis-custom-audio-progress-bg {
2101
+ position: relative;
1699
2102
  width: 100%;
1700
- max-width: 100%;
1701
- height: 32px;
2103
+ height: 4px;
2104
+ background-color: rgba(0, 0, 0, 0.1);
2105
+ border-radius: 2px;
2106
+ cursor: pointer;
1702
2107
  }
1703
- .ermis-attachment__voice-duration {
1704
- font-size: var(--ermis-font-size-xs);
1705
- color: var(--ermis-text-muted);
2108
+ .ermis-message-bubble--own .ermis-custom-audio-progress-bg {
2109
+ background-color: rgba(255, 255, 255, 0.3);
2110
+ }
2111
+ .ermis-custom-audio-progress-fill {
2112
+ position: absolute;
2113
+ top: 0;
2114
+ left: 0;
2115
+ height: 100%;
2116
+ background-color: var(--ermis-accent);
2117
+ border-radius: 2px;
2118
+ pointer-events: none;
2119
+ }
2120
+ .ermis-message-bubble--own .ermis-custom-audio-progress-fill {
2121
+ background-color: var(--ermis-bubble-own-text);
2122
+ }
2123
+ .ermis-custom-audio-progress-thumb {
2124
+ position: absolute;
2125
+ top: 50%;
2126
+ width: 12px;
2127
+ height: 12px;
2128
+ background-color: var(--ermis-accent);
2129
+ border-radius: 50%;
2130
+ transform: translate(-50%, -50%);
2131
+ pointer-events: none;
2132
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
2133
+ }
2134
+ .ermis-message-bubble--own .ermis-custom-audio-progress-thumb {
2135
+ background-color: var(--ermis-bubble-own-text);
2136
+ }
2137
+ .ermis-custom-audio-duration {
2138
+ font-size: var(--ermis-font-size-sm);
2139
+ color: var(--ermis-text-primary);
2140
+ font-weight: 500;
2141
+ flex-shrink: 0;
2142
+ min-width: 32px;
2143
+ text-align: right;
2144
+ }
2145
+ .ermis-message-bubble--own .ermis-custom-audio-duration {
2146
+ color: var(--ermis-bubble-own-text);
2147
+ }
2148
+ .ermis-custom-audio-download-btn {
2149
+ display: flex;
2150
+ align-items: center;
2151
+ justify-content: center;
2152
+ width: 32px;
2153
+ height: 32px;
2154
+ border-radius: 50%;
2155
+ background: transparent;
2156
+ color: var(--ermis-colors-text-muted, #72767d);
2157
+ border: none;
2158
+ cursor: pointer;
2159
+ transition: background-color 0.2s, color 0.2s;
1706
2160
  flex-shrink: 0;
2161
+ margin-left: 8px;
2162
+ }
2163
+ .ermis-custom-audio-download-btn:hover {
2164
+ background-color: var(--ermis-colors-bg-hover, rgba(0, 0, 0, 0.05));
2165
+ color: var(--ermis-colors-text-normal, #36393f);
2166
+ }
2167
+ .ermis-message-bubble--own .ermis-custom-audio-download-btn {
2168
+ color: rgba(255, 255, 255, 0.8);
2169
+ }
2170
+ .ermis-message-bubble--own .ermis-custom-audio-download-btn:hover {
2171
+ background-color: rgba(255, 255, 255, 0.15);
2172
+ color: #fff;
2173
+ }
2174
+ .ermis-custom-audio-hidden {
2175
+ display: none;
1707
2176
  }
1708
2177
  .ermis-attachment--link-preview {
1709
2178
  display: flex;
@@ -1781,9 +2250,10 @@
1781
2250
  }
1782
2251
  .ermis-message-sticker-wrapper {
1783
2252
  position: relative;
1784
- width: 120px;
1785
- height: 120px;
2253
+ width: 160px;
2254
+ height: 160px;
1786
2255
  overflow: hidden;
2256
+ border-radius: 10px;
1787
2257
  }
1788
2258
  .ermis-message-sticker {
1789
2259
  position: absolute;
@@ -1798,6 +2268,38 @@
1798
2268
  .ermis-message-sticker.ermis-attachment--loaded {
1799
2269
  opacity: 1;
1800
2270
  }
2271
+ .ermis-message-list__item--sticker .ermis-message-bubble {
2272
+ background: transparent !important;
2273
+ box-shadow: none !important;
2274
+ padding: 0 !important;
2275
+ border: none !important;
2276
+ position: relative;
2277
+ border-radius: 0;
2278
+ display: inline-block;
2279
+ }
2280
+ .ermis-message-list__item--sticker .ermis-message-bubble::after {
2281
+ display: none;
2282
+ }
2283
+ .ermis-message-list__item--sticker .ermis-message-list__item-time {
2284
+ position: absolute;
2285
+ bottom: 8px;
2286
+ right: 8px;
2287
+ color: #ffffff;
2288
+ padding: 2px 8px;
2289
+ border-radius: 12px;
2290
+ font-size: 11px;
2291
+ margin: 0;
2292
+ line-height: 1.2;
2293
+ font-weight: 500;
2294
+ text-shadow: 0px 1px 3px rgba(0, 0, 0, 0.8), 0px 0px 1px rgba(0, 0, 0, 0.6);
2295
+ }
2296
+ .ermis-message-list__item--sticker .ermis-message-list__item-time .ermis-message-list__edited-indicator {
2297
+ color: rgba(255, 255, 255, 0.9);
2298
+ }
2299
+ .ermis-message-list__item--sticker .ermis-message-list__item-time svg {
2300
+ color: #ffffff;
2301
+ filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.8));
2302
+ }
1801
2303
  .ermis-message-error {
1802
2304
  font-size: var(--ermis-font-size-sm);
1803
2305
  color: #ef4444;
@@ -1805,10 +2307,16 @@
1805
2307
  }
1806
2308
  .ermis-read-receipts {
1807
2309
  display: flex;
1808
- justify-content: flex-end;
1809
2310
  width: 100%;
1810
2311
  padding-top: 2px;
1811
2312
  }
2313
+ .ermis-read-receipts--own {
2314
+ justify-content: flex-end;
2315
+ }
2316
+ .ermis-read-receipts--other {
2317
+ justify-content: flex-start;
2318
+ padding-left: 2.75rem;
2319
+ }
1812
2320
  @keyframes ermis-receipt-pop {
1813
2321
  0% {
1814
2322
  opacity: 0;
@@ -1826,6 +2334,7 @@
1826
2334
  cursor: default;
1827
2335
  position: relative;
1828
2336
  animation: ermis-receipt-pop 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
2337
+ z-index: 5;
1829
2338
  }
1830
2339
  .ermis-read-receipts__avatar {
1831
2340
  flex-shrink: 0;
@@ -1856,9 +2365,14 @@
1856
2365
  display: none;
1857
2366
  position: absolute;
1858
2367
  bottom: calc(100% + 6px);
1859
- right: 0;
1860
2368
  z-index: 50;
1861
2369
  }
2370
+ .ermis-read-receipts--own .ermis-read-receipts__tooltip-wrapper {
2371
+ right: 0;
2372
+ }
2373
+ .ermis-read-receipts--other .ermis-read-receipts__tooltip-wrapper {
2374
+ left: 0;
2375
+ }
1862
2376
  .ermis-read-receipts__tooltip-wrapper::after {
1863
2377
  content: "";
1864
2378
  position: absolute;
@@ -1868,8 +2382,19 @@
1868
2382
  height: 6px;
1869
2383
  background: transparent;
1870
2384
  }
2385
+ @keyframes ermis-tooltip-fade-in {
2386
+ from {
2387
+ opacity: 0;
2388
+ transform: translateY(6px);
2389
+ }
2390
+ to {
2391
+ opacity: 1;
2392
+ transform: translateY(0);
2393
+ }
2394
+ }
1871
2395
  .ermis-read-receipts__avatars:hover .ermis-read-receipts__tooltip-wrapper {
1872
2396
  display: flex;
2397
+ animation: ermis-tooltip-fade-in 0.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1873
2398
  }
1874
2399
  .ermis-read-receipts__tooltip {
1875
2400
  display: flex;
@@ -1878,34 +2403,50 @@
1878
2403
  background-color: var(--ermis-bg-secondary);
1879
2404
  border: 1px solid var(--ermis-border);
1880
2405
  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;
2406
+ padding: 8px 12px;
2407
+ box-shadow: none;
2408
+ min-width: 140px;
2409
+ width: max-content;
2410
+ max-width: 220px;
2411
+ max-height: 250px;
1885
2412
  overflow-y: auto;
1886
2413
  }
2414
+ .ermis-read-receipts__tooltip::-webkit-scrollbar {
2415
+ width: 4px;
2416
+ }
2417
+ .ermis-read-receipts__tooltip::-webkit-scrollbar-track {
2418
+ background: transparent;
2419
+ }
2420
+ .ermis-read-receipts__tooltip::-webkit-scrollbar-thumb {
2421
+ background: var(--ermis-border);
2422
+ border-radius: 4px;
2423
+ }
1887
2424
  .ermis-read-receipts__tooltip-item {
1888
2425
  display: flex;
1889
2426
  align-items: center;
1890
- gap: var(--ermis-spacing-sm, 8px);
2427
+ gap: 10px;
2428
+ padding: 2px 0;
1891
2429
  }
1892
2430
  .ermis-read-receipts__tooltip-info {
1893
2431
  display: flex;
1894
2432
  flex-direction: column;
1895
- gap: 1px;
2433
+ gap: 2px;
1896
2434
  min-width: 0;
1897
2435
  }
1898
2436
  .ermis-read-receipts__tooltip-name {
1899
- font-size: var(--ermis-font-size-xs, 0.75rem);
2437
+ font-size: var(--ermis-font-size-sm, 0.875rem);
2438
+ font-weight: 500;
1900
2439
  color: var(--ermis-text-primary);
1901
2440
  white-space: nowrap;
1902
2441
  overflow: hidden;
1903
2442
  text-overflow: ellipsis;
2443
+ line-height: 1.2;
1904
2444
  }
1905
2445
  .ermis-read-receipts__tooltip-time {
1906
- font-size: 0.625rem;
2446
+ font-size: 0.65rem;
1907
2447
  color: var(--ermis-text-muted);
1908
2448
  white-space: nowrap;
2449
+ line-height: 1.2;
1909
2450
  }
1910
2451
 
1911
2452
  /* src/styles/_message-input.css */
@@ -1918,6 +2459,7 @@
1918
2459
  background-color: var(--ermis-bg-secondary);
1919
2460
  font-family: var(--ermis-font-family);
1920
2461
  position: relative;
2462
+ overflow: hidden;
1921
2463
  }
1922
2464
  .ermis-message-input__row {
1923
2465
  display: flex;
@@ -2009,6 +2551,52 @@
2009
2551
  .ermis-message-input__emoji-btn--active {
2010
2552
  color: var(--ermis-accent);
2011
2553
  }
2554
+ .ermis-message-input__voice-btn {
2555
+ display: inline-flex;
2556
+ align-items: center;
2557
+ justify-content: center;
2558
+ padding: 4px;
2559
+ border: none;
2560
+ background: none;
2561
+ font-size: 1.25rem;
2562
+ cursor: pointer;
2563
+ color: var(--ermis-text-secondary);
2564
+ transition: color var(--ermis-transition);
2565
+ flex-shrink: 0;
2566
+ }
2567
+ .ermis-message-input__voice-btn:hover {
2568
+ color: var(--ermis-accent);
2569
+ }
2570
+ .ermis-message-input__voice-btn--recording {
2571
+ color: var(--ermis-color-danger);
2572
+ }
2573
+ .ermis-message-input__voice-btn:disabled {
2574
+ opacity: 0.4;
2575
+ cursor: not-allowed;
2576
+ }
2577
+ .ermis-message-input__voice-recording-indicator {
2578
+ display: flex;
2579
+ align-items: center;
2580
+ gap: 6px;
2581
+ font-size: var(--ermis-font-size-sm);
2582
+ font-weight: 500;
2583
+ color: var(--ermis-color-danger);
2584
+ }
2585
+ .ermis-message-input__voice-dot {
2586
+ width: 8px;
2587
+ height: 8px;
2588
+ background-color: var(--ermis-color-danger);
2589
+ border-radius: 50%;
2590
+ animation: ermis-blink 1.5s ease-in-out infinite;
2591
+ }
2592
+ @keyframes ermis-blink {
2593
+ 0%, 100% {
2594
+ opacity: 1;
2595
+ }
2596
+ 50% {
2597
+ opacity: 0.4;
2598
+ }
2599
+ }
2012
2600
  .ermis-message-input__emoji-picker {
2013
2601
  position: absolute;
2014
2602
  bottom: 100%;
@@ -2019,6 +2607,44 @@
2019
2607
  box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.15);
2020
2608
  overflow: hidden;
2021
2609
  }
2610
+ .ermis-message-input__sticker-btn {
2611
+ display: inline-flex;
2612
+ align-items: center;
2613
+ justify-content: center;
2614
+ padding: 4px;
2615
+ border: none;
2616
+ background: none;
2617
+ font-size: 1.25rem;
2618
+ cursor: pointer;
2619
+ color: var(--ermis-text-secondary);
2620
+ transition: color var(--ermis-transition);
2621
+ flex-shrink: 0;
2622
+ }
2623
+ .ermis-message-input__sticker-btn:hover,
2624
+ .ermis-message-input__sticker-btn--active {
2625
+ color: var(--ermis-accent);
2626
+ }
2627
+ .ermis-message-input__sticker-btn:disabled {
2628
+ opacity: 0.4;
2629
+ cursor: not-allowed;
2630
+ }
2631
+ .ermis-message-input__sticker-picker-container {
2632
+ position: absolute;
2633
+ bottom: 100%;
2634
+ right: 0;
2635
+ margin-bottom: var(--ermis-spacing-xs);
2636
+ z-index: 100;
2637
+ border-radius: var(--ermis-radius-lg);
2638
+ box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.15);
2639
+ overflow: hidden;
2640
+ }
2641
+ .ermis-message-input__sticker-iframe {
2642
+ border: none;
2643
+ width: 320px;
2644
+ height: 400px;
2645
+ background: var(--ermis-bg-primary);
2646
+ display: block;
2647
+ }
2022
2648
  .ermis-files-preview {
2023
2649
  display: flex;
2024
2650
  gap: var(--ermis-spacing-sm);
@@ -2103,6 +2729,13 @@
2103
2729
  align-items: center;
2104
2730
  justify-content: center;
2105
2731
  }
2732
+ .ermis-files-preview__progress {
2733
+ color: #fff;
2734
+ font-size: 11px;
2735
+ font-weight: 600;
2736
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8);
2737
+ z-index: 2;
2738
+ }
2106
2739
  .ermis-files-preview__spinner {
2107
2740
  width: 20px;
2108
2741
  height: 20px;
@@ -2254,6 +2887,35 @@
2254
2887
  border-top-left-radius: 0;
2255
2888
  border-top-right-radius: 0;
2256
2889
  }
2890
+ .ermis-channel__drop-overlay {
2891
+ position: fixed;
2892
+ inset: 0;
2893
+ z-index: 9999;
2894
+ background-color: var(--ermis-bg-overlay);
2895
+ backdrop-filter: blur(4px);
2896
+ display: flex;
2897
+ align-items: center;
2898
+ justify-content: center;
2899
+ pointer-events: none;
2900
+ }
2901
+ .ermis-channel__drop-overlay-content {
2902
+ border: 2px dashed var(--ermis-accent);
2903
+ border-radius: var(--ermis-radius-lg);
2904
+ padding: var(--ermis-spacing-xl) var(--ermis-spacing-xxl);
2905
+ display: flex;
2906
+ flex-direction: column;
2907
+ align-items: center;
2908
+ gap: var(--ermis-spacing-md);
2909
+ color: var(--ermis-accent);
2910
+ background-color: var(--ermis-bg-primary);
2911
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
2912
+ pointer-events: none;
2913
+ }
2914
+ .ermis-channel__drop-overlay-content span {
2915
+ font-size: var(--ermis-font-size-lg);
2916
+ font-weight: 600;
2917
+ font-family: var(--ermis-font-family);
2918
+ }
2257
2919
 
2258
2920
  /* src/styles/_mentions.css */
2259
2921
  .ermis-message-input__editable-wrapper {
@@ -2323,7 +2985,7 @@
2323
2985
  }
2324
2986
  .ermis-mention-suggestions__item:hover,
2325
2987
  .ermis-mention-suggestions__item--highlighted {
2326
- background-color: var(--ermis-bg-secondary);
2988
+ background-color: var(--ermis-bg-active);
2327
2989
  }
2328
2990
  .ermis-mention-suggestions__name {
2329
2991
  font-size: var(--ermis-font-size-sm);
@@ -2490,11 +3152,11 @@
2490
3152
  opacity: 1;
2491
3153
  }
2492
3154
  .ermis-message-list__item--own .ermis-message-list__actions {
2493
- right: 100%;
3155
+ right: calc(100% + 12px);
2494
3156
  flex-direction: row-reverse;
2495
3157
  }
2496
3158
  .ermis-message-list__item--other .ermis-message-list__actions {
2497
- left: 100%;
3159
+ left: calc(100% + 12px);
2498
3160
  }
2499
3161
  .ermis-message-list__actions-trigger {
2500
3162
  display: inline-flex;
@@ -2589,14 +3251,27 @@
2589
3251
  .ermis-forward-modal__channel-item--selected {
2590
3252
  background: var(--ermis-bg-active);
2591
3253
  }
2592
- .ermis-forward-modal__channel-name {
3254
+ .ermis-forward-modal__channel-name-container {
2593
3255
  flex: 1;
3256
+ display: flex;
3257
+ flex-direction: column;
3258
+ overflow: hidden;
3259
+ }
3260
+ .ermis-forward-modal__channel-name {
2594
3261
  font-size: var(--ermis-font-size-sm);
2595
3262
  color: var(--ermis-text-primary);
2596
3263
  overflow: hidden;
2597
3264
  text-overflow: ellipsis;
2598
3265
  white-space: nowrap;
2599
3266
  }
3267
+ .ermis-forward-modal__channel-parent-name {
3268
+ font-size: var(--ermis-font-size-xs);
3269
+ color: var(--ermis-text-muted);
3270
+ overflow: hidden;
3271
+ text-overflow: ellipsis;
3272
+ white-space: nowrap;
3273
+ margin-bottom: 2px;
3274
+ }
2600
3275
  .ermis-forward-modal__checkbox {
2601
3276
  width: 20px;
2602
3277
  height: 20px;
@@ -2672,30 +3347,41 @@
2672
3347
  }
2673
3348
 
2674
3349
  /* src/styles/_typing-indicator.css */
3350
+ .ermis-typing-indicator-wrapper {
3351
+ height: 0;
3352
+ overflow: visible;
3353
+ padding-left: 16px;
3354
+ position: relative;
3355
+ z-index: 10;
3356
+ }
2675
3357
  .ermis-typing-indicator {
2676
- display: flex;
3358
+ display: inline-flex;
2677
3359
  align-items: center;
2678
3360
  gap: 6px;
2679
- padding: 0 16px;
2680
- height: 24px;
2681
3361
  font-size: 12px;
2682
3362
  color: var(--ermis-text-secondary);
2683
- overflow: hidden;
3363
+ background-color: var(--ermis-bg-primary, #fff);
3364
+ padding: 4px 12px;
3365
+ border-radius: 999px;
3366
+ border: 1px solid var(--ermis-border, rgba(0, 0, 0, 0.08));
3367
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
3368
+ transform: translateY(-100%);
3369
+ margin-bottom: 8px;
3370
+ animation: ermis-typing-appear 0.2s ease-out forwards;
2684
3371
  }
2685
3372
  .ermis-typing-indicator__dots {
2686
3373
  display: flex;
2687
3374
  align-items: center;
2688
3375
  gap: 3px;
2689
- animation: ermis-typing-appear 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
2690
3376
  }
2691
3377
  @keyframes ermis-typing-appear {
2692
3378
  0% {
2693
3379
  opacity: 0;
2694
- transform: translateY(8px);
3380
+ transform: translateY(calc(-100% + 4px));
2695
3381
  }
2696
3382
  100% {
2697
3383
  opacity: 1;
2698
- transform: translateY(0);
3384
+ transform: translateY(-100%);
2699
3385
  }
2700
3386
  }
2701
3387
  .ermis-typing-indicator__dot {
@@ -2729,67 +3415,55 @@
2729
3415
  white-space: nowrap;
2730
3416
  overflow: hidden;
2731
3417
  text-overflow: ellipsis;
2732
- animation: ermis-typing-appear 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
2733
3418
  }
2734
3419
 
2735
3420
  /* src/styles/_message-reactions.css */
2736
3421
  .ermis-message-reactions {
2737
- display: flex;
3422
+ display: inline-flex;
2738
3423
  flex-wrap: wrap;
2739
3424
  gap: 4px;
2740
- margin-bottom: 2px;
2741
- margin-top: 2px;
2742
- width: 100%;
3425
+ margin-top: 4px;
3426
+ max-width: 100%;
3427
+ vertical-align: middle;
2743
3428
  }
2744
3429
  .ermis-message-reactions--disabled {
2745
3430
  opacity: 0.8;
2746
3431
  pointer-events: none;
2747
3432
  }
3433
+ .ermis-message-reactions--own {
3434
+ justify-content: flex-end;
3435
+ }
2748
3436
  .ermis-message-reactions__item {
2749
3437
  position: relative;
2750
3438
  display: inline-flex;
2751
3439
  align-items: center;
2752
3440
  gap: 4px;
2753
3441
  padding: 2px 6px;
2754
- border-radius: 12px;
2755
- background-color: var(--ermis-surface);
2756
- border: 1px solid var(--ermis-border);
2757
- font-size: 11px;
2758
- line-height: 1.2;
2759
- color: var(--ermis-text-secondary);
2760
- cursor: pointer;
2761
- transition: all 0.2s ease;
2762
- user-select: none;
2763
- }
2764
- .ermis-message-reactions__item::after {
2765
- content: attr(data-tooltip);
2766
- position: absolute;
2767
- bottom: 100%;
2768
- left: 50%;
2769
- transform: translateX(-50%);
2770
- background-color: rgba(0, 0, 0, 0.75);
2771
- color: #fff;
2772
- padding: 4px 8px;
2773
- border-radius: 6px;
2774
- font-size: 11px;
2775
- white-space: pre;
2776
- text-align: left;
2777
- pointer-events: none;
2778
- opacity: 0;
2779
- visibility: hidden;
2780
- transition: opacity 0.2s, visibility 0.2s;
2781
- margin-bottom: 6px;
2782
- z-index: 100;
2783
- }
2784
- .ermis-message-reactions__item:hover::after {
2785
- opacity: 1;
2786
- visibility: visible;
3442
+ border-radius: 12px;
3443
+ background-color: var(--ermis-bg-hover);
3444
+ border: 1px solid var(--ermis-border);
3445
+ font-size: 11px;
3446
+ line-height: 1.2;
3447
+ color: var(--ermis-text-secondary);
3448
+ cursor: pointer;
3449
+ transition: all 0.2s ease;
3450
+ user-select: none;
2787
3451
  }
2788
3452
  .ermis-message-reactions__item--active {
2789
3453
  background-color: var(--ermis-bg-active, rgba(99, 102, 241, 0.12));
2790
3454
  border-color: var(--ermis-accent);
2791
3455
  color: var(--ermis-accent);
2792
3456
  }
3457
+ .ermis-message-bubble--own .ermis-message-reactions__item {
3458
+ background-color: rgba(255, 255, 255, 0.2);
3459
+ border-color: rgba(255, 255, 255, 0.3);
3460
+ color: rgba(255, 255, 255, 0.9);
3461
+ }
3462
+ .ermis-message-bubble--own .ermis-message-reactions__item--active {
3463
+ background-color: rgba(255, 255, 255, 0.35);
3464
+ border-color: rgba(255, 255, 255, 0.6);
3465
+ color: #ffffff;
3466
+ }
2793
3467
  .ermis-message-reactions__emoji {
2794
3468
  font-size: 14px;
2795
3469
  }
@@ -2798,61 +3472,112 @@
2798
3472
  }
2799
3473
 
2800
3474
  /* src/styles/_message-quick-reactions.css */
2801
- .ermis-message-quick-reactions {
3475
+ .ermis-qr-wrapper {
3476
+ position: relative;
3477
+ display: inline-flex;
3478
+ }
3479
+ .ermis-qr__strip--horizontal {
2802
3480
  position: absolute;
2803
- bottom: calc(100% - 10px);
3481
+ bottom: calc(100% + 8px);
3482
+ left: 50%;
2804
3483
  display: flex;
3484
+ flex-direction: row;
2805
3485
  align-items: center;
2806
3486
  gap: 2px;
2807
- background-color: var(--ermis-bg-primary);
3487
+ background-color: var(--ermis-bg-primary, #ffffff);
2808
3488
  border: 1px solid var(--ermis-border);
2809
- padding: 4px;
2810
3489
  border-radius: 20px;
2811
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
3490
+ padding: 4px;
3491
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
3492
+ z-index: 101;
3493
+ width: max-content;
2812
3494
  opacity: 0;
2813
- visibility: hidden;
2814
- pointer-events: none;
2815
- transform: translateY(8px);
2816
- transition: opacity 0.2s ease, transform 0.2s ease;
2817
- z-index: 20;
3495
+ transform: translateX(-50%) scale(0.95);
3496
+ animation: ermis-qr-pop-centered 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
2818
3497
  }
2819
- .ermis-message-quick-reactions {
3498
+ .ermis-qr__strip--horizontal::after {
3499
+ content: "";
3500
+ position: absolute;
3501
+ top: 100%;
2820
3502
  left: 0;
3503
+ width: 100%;
3504
+ height: 12px;
2821
3505
  }
2822
- .ermis-message-quick-reactions--own {
2823
- left: auto;
2824
- right: 0;
3506
+ @keyframes ermis-qr-pop-centered {
3507
+ to {
3508
+ opacity: 1;
3509
+ transform: translateX(-50%) scale(1);
3510
+ }
2825
3511
  }
2826
- .ermis-message-list__bubble-wrapper:hover .ermis-message-quick-reactions {
2827
- opacity: 1;
2828
- visibility: visible;
2829
- pointer-events: auto;
2830
- transform: translateY(0);
3512
+ @keyframes ermis-qr-pop {
3513
+ to {
3514
+ opacity: 1;
3515
+ transform: scale(1);
3516
+ }
2831
3517
  }
2832
- .ermis-message-list__bubble-wrapper:hover .ermis-message-quick-reactions--disabled {
2833
- opacity: 0.5;
2834
- pointer-events: none;
3518
+ .ermis-message-list__item--own .ermis-qr__strip--horizontal {
3519
+ left: 50%;
3520
+ }
3521
+ .ermis-message-list__item--other .ermis-qr__strip--horizontal {
3522
+ left: 50%;
2835
3523
  }
2836
- .ermis-message-quick-reactions__btn {
3524
+ .ermis-qr__emoji {
2837
3525
  display: flex;
2838
3526
  align-items: center;
2839
3527
  justify-content: center;
2840
- background: none;
3528
+ background: transparent;
2841
3529
  border: none;
2842
- font-size: 18px;
3530
+ font-size: 16px;
2843
3531
  line-height: 1;
2844
3532
  width: 32px;
2845
3533
  height: 32px;
2846
3534
  border-radius: 50%;
2847
3535
  cursor: pointer;
2848
3536
  transition: transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275), background-color 0.15s;
3537
+ padding: 0;
3538
+ outline: none;
3539
+ color: inherit;
3540
+ flex-shrink: 0;
2849
3541
  }
2850
- .ermis-message-quick-reactions__btn:hover {
3542
+ .ermis-qr__emoji:hover {
2851
3543
  transform: scale(1.2);
2852
- background-color: var(--ermis-bg-hover);
3544
+ background-color: rgba(0, 0, 0, 0.05);
2853
3545
  }
2854
- .ermis-message-quick-reactions__btn--active {
2855
- background-color: var(--ermis-bg-active, rgba(99, 102, 241, 0.12));
3546
+ .ermis-qr__emoji--active {
3547
+ background-color: rgba(99, 102, 241, 0.1);
3548
+ }
3549
+ .ermis-qr__emoji--more {
3550
+ color: var(--ermis-text-muted);
3551
+ font-size: 14px;
3552
+ }
3553
+ .ermis-qr__emoji--more:hover {
3554
+ color: var(--ermis-text-primary);
3555
+ }
3556
+ .ermis-qr__picker {
3557
+ position: absolute;
3558
+ width: 350px;
3559
+ height: 368px;
3560
+ border-radius: 16px;
3561
+ overflow: hidden;
3562
+ background-color: var(--ermis-bg-primary);
3563
+ border: 1px solid var(--ermis-border);
3564
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
3565
+ z-index: 102;
3566
+ opacity: 0;
3567
+ transform: scale(0.95);
3568
+ animation: ermis-qr-pop 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
3569
+ }
3570
+ .ermis-qr__picker--top {
3571
+ bottom: calc(100% + 8px);
3572
+ }
3573
+ .ermis-qr__picker--bottom {
3574
+ top: calc(100% + 8px);
3575
+ }
3576
+ .ermis-message-list__item--own .ermis-qr__picker {
3577
+ right: -8px;
3578
+ }
3579
+ .ermis-message-list__item--other .ermis-qr__picker {
3580
+ left: -8px;
2856
3581
  }
2857
3582
 
2858
3583
  /* src/styles/_channel-info.css */
@@ -2864,9 +3589,16 @@
2864
3589
  height: 100%;
2865
3590
  background: var(--ermis-bg-primary);
2866
3591
  border-left: 1px solid var(--ermis-border-base);
3592
+ display: flex;
3593
+ flex-direction: column;
3594
+ overflow: hidden;
3595
+ box-sizing: border-box;
3596
+ }
3597
+ .ermis-channel-info__body {
3598
+ flex: 1;
2867
3599
  overflow-y: auto;
2868
3600
  overflow-x: hidden;
2869
- box-sizing: border-box;
3601
+ scroll-behavior: smooth;
2870
3602
  }
2871
3603
  .ermis-channel-info__header {
2872
3604
  display: flex;
@@ -3134,7 +3866,6 @@
3134
3866
  border-color: var(--ermis-accent);
3135
3867
  }
3136
3868
  .ermis-channel-info__media-section {
3137
- flex: 1;
3138
3869
  display: flex;
3139
3870
  flex-direction: column;
3140
3871
  padding: 0;
@@ -3146,6 +3877,10 @@
3146
3877
  padding: 0 4px;
3147
3878
  gap: 0;
3148
3879
  flex-shrink: 0;
3880
+ position: sticky;
3881
+ top: 0;
3882
+ z-index: 10;
3883
+ background-color: var(--ermis-bg-primary);
3149
3884
  }
3150
3885
  .ermis-channel-info__media-tab {
3151
3886
  flex: 1;
@@ -3192,8 +3927,6 @@
3192
3927
  color: #fff;
3193
3928
  }
3194
3929
  .ermis-channel-info__media-content {
3195
- flex: 1;
3196
- overflow: hidden;
3197
3930
  min-height: 120px;
3198
3931
  }
3199
3932
  .ermis-channel-info__media-grid-row {
@@ -3273,6 +4006,14 @@
3273
4006
  .ermis-channel-info__media-play-icon svg {
3274
4007
  margin-left: 2px;
3275
4008
  }
4009
+ .ermis-channel-info__media-spinner {
4010
+ width: 16px;
4011
+ height: 16px;
4012
+ border: 2px solid rgba(255, 255, 255, 0.35);
4013
+ border-top-color: #fff;
4014
+ border-radius: 50%;
4015
+ animation: ermis-lightbox-spin 0.8s linear infinite;
4016
+ }
3276
4017
  .ermis-channel-info__links-list {
3277
4018
  display: flex;
3278
4019
  flex-direction: column;
@@ -3663,6 +4404,30 @@
3663
4404
  font-weight: 500;
3664
4405
  color: var(--ermis-text-secondary);
3665
4406
  }
4407
+ .ermis-channel-info__preview-actions {
4408
+ display: flex;
4409
+ justify-content: center;
4410
+ padding: 12px 16px;
4411
+ border-bottom: 1px solid var(--ermis-border);
4412
+ }
4413
+ .ermis-channel-info__join-btn {
4414
+ width: 100%;
4415
+ justify-content: center;
4416
+ font-weight: 600;
4417
+ padding: 10px 16px;
4418
+ border-radius: var(--ermis-radius-lg);
4419
+ background-color: var(--ermis-accent);
4420
+ color: #ffffff;
4421
+ border: none;
4422
+ cursor: pointer;
4423
+ transition: opacity 0.2s ease, transform 0.1s ease;
4424
+ }
4425
+ .ermis-channel-info__join-btn:hover {
4426
+ opacity: 0.9;
4427
+ }
4428
+ .ermis-channel-info__join-btn:active {
4429
+ transform: scale(0.98);
4430
+ }
3666
4431
 
3667
4432
  /* src/styles/_add-member-modal.css */
3668
4433
  .ermis-modal-search {
@@ -4273,6 +5038,8 @@
4273
5038
  }
4274
5039
  .ermis-create-channel__users {
4275
5040
  margin-top: var(--ermis-spacing-sm, 0.5rem);
5041
+ display: flex;
5042
+ flex-direction: column;
4276
5043
  }
4277
5044
  .ermis-create-channel__users-title {
4278
5045
  font-size: var(--ermis-font-size-sm, 0.875rem);
@@ -4476,6 +5243,11 @@
4476
5243
  .ermis-call-ui__action-circle:active {
4477
5244
  transform: scale(0.95);
4478
5245
  }
5246
+ .ermis-call-ui__action-circle:disabled {
5247
+ opacity: 0.7;
5248
+ cursor: not-allowed;
5249
+ transform: none;
5250
+ }
4479
5251
  .ermis-call-ui__action-circle--reject {
4480
5252
  background-color: var(--ermis-color-danger);
4481
5253
  box-shadow: 0 4px 20px rgba(239, 68, 68, 0.35);
@@ -4519,7 +5291,7 @@
4519
5291
  .ermis-call-ui__video-remote {
4520
5292
  width: 100%;
4521
5293
  height: 100%;
4522
- object-fit: cover;
5294
+ object-fit: contain;
4523
5295
  }
4524
5296
  .ermis-call-ui__video-local {
4525
5297
  position: absolute;
@@ -4542,7 +5314,7 @@
4542
5314
  .ermis-call-ui__video-local-stream {
4543
5315
  width: 100%;
4544
5316
  height: 100%;
4545
- object-fit: cover;
5317
+ object-fit: contain;
4546
5318
  transform: scaleX(-1);
4547
5319
  }
4548
5320
  .ermis-call-ui__remote-muted-badge {
@@ -4590,6 +5362,35 @@
4590
5362
  padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
4591
5363
  background: linear-gradient(transparent, rgba(0, 0, 0, 0.6));
4592
5364
  }
5365
+ .ermis-call-ui__video-timer {
5366
+ position: absolute;
5367
+ top: 16px;
5368
+ left: 16px;
5369
+ z-index: 15;
5370
+ display: flex;
5371
+ align-items: center;
5372
+ gap: 6px;
5373
+ padding: 4px 12px;
5374
+ border-radius: var(--ermis-radius-full);
5375
+ background: rgba(0, 0, 0, 0.45);
5376
+ backdrop-filter: blur(12px);
5377
+ -webkit-backdrop-filter: blur(12px);
5378
+ border: 1px solid rgba(255, 255, 255, 0.1);
5379
+ color: rgba(255, 255, 255, 0.85);
5380
+ font-size: var(--ermis-font-size-sm);
5381
+ font-variant-numeric: tabular-nums;
5382
+ font-weight: 500;
5383
+ user-select: none;
5384
+ }
5385
+ .ermis-call-ui__video-timer-mic {
5386
+ display: flex;
5387
+ align-items: center;
5388
+ color: #f87171;
5389
+ }
5390
+ .ermis-call-ui__video-timer-mic svg {
5391
+ width: 16px;
5392
+ height: 16px;
5393
+ }
4593
5394
  .ermis-call-ui__audio-container {
4594
5395
  text-align: center;
4595
5396
  padding: 2.5rem var(--ermis-spacing-lg) 2rem;
@@ -4938,6 +5739,19 @@
4938
5739
  transform: none;
4939
5740
  }
4940
5741
  }
5742
+ .ermis-call-ui__spinner {
5743
+ width: 20px;
5744
+ height: 20px;
5745
+ border: 2px solid rgba(255, 255, 255, 0.3);
5746
+ border-radius: 50%;
5747
+ border-top-color: #ffffff;
5748
+ animation: ermis-call-spin 0.8s linear infinite;
5749
+ }
5750
+ @keyframes ermis-call-spin {
5751
+ to {
5752
+ transform: rotate(360deg);
5753
+ }
5754
+ }
4941
5755
 
4942
5756
  /* src/styles/_topic-modal.css */
4943
5757
  .ermis-create-topic__body {
@@ -5131,6 +5945,10 @@
5131
5945
  background: rgba(255, 255, 255, 0.2);
5132
5946
  color: #fff;
5133
5947
  }
5948
+ .ermis-lightbox__action-btn:disabled {
5949
+ opacity: 0.4;
5950
+ cursor: not-allowed;
5951
+ }
5134
5952
  .ermis-lightbox__content {
5135
5953
  position: relative;
5136
5954
  z-index: 1;
@@ -5164,6 +5982,12 @@
5164
5982
  transform: scale(1);
5165
5983
  }
5166
5984
  }
5985
+ .ermis-lightbox__video-wrapper {
5986
+ position: relative;
5987
+ display: flex;
5988
+ align-items: center;
5989
+ justify-content: center;
5990
+ }
5167
5991
  .ermis-lightbox__video {
5168
5992
  max-width: 90vw;
5169
5993
  max-height: 80vh;
@@ -5172,6 +5996,47 @@
5172
5996
  outline: none;
5173
5997
  animation: ermis-lightbox-zoom-in 0.25s cubic-bezier(0.16, 1, 0.3, 1);
5174
5998
  }
5999
+ .ermis-lightbox__video-retry {
6000
+ position: absolute;
6001
+ inset: 0;
6002
+ display: flex;
6003
+ align-items: center;
6004
+ justify-content: center;
6005
+ background: rgba(0, 0, 0, 0.5);
6006
+ border-radius: 4px;
6007
+ pointer-events: none;
6008
+ }
6009
+ .ermis-lightbox__video-spinner {
6010
+ width: 36px;
6011
+ height: 36px;
6012
+ border: 3px solid rgba(255, 255, 255, 0.2);
6013
+ border-top-color: #fff;
6014
+ border-radius: 50%;
6015
+ animation: ermis-lightbox-spin 0.8s linear infinite;
6016
+ }
6017
+ .ermis-lightbox__video-retry {
6018
+ flex-direction: column;
6019
+ gap: 10px;
6020
+ }
6021
+ .ermis-lightbox__progress-label {
6022
+ color: rgba(255, 255, 255, 0.86);
6023
+ font-size: 13px;
6024
+ font-weight: 500;
6025
+ }
6026
+ .ermis-lightbox__media-placeholder {
6027
+ width: min(80vw, 720px);
6028
+ height: min(60vh, 420px);
6029
+ border-radius: 4px;
6030
+ background: rgba(255, 255, 255, 0.08);
6031
+ }
6032
+ .ermis-lightbox__image--poster {
6033
+ filter: none;
6034
+ }
6035
+ @keyframes ermis-lightbox-spin {
6036
+ to {
6037
+ transform: rotate(360deg);
6038
+ }
6039
+ }
5175
6040
  .ermis-lightbox__nav {
5176
6041
  position: absolute;
5177
6042
  top: 50%;
@@ -5279,5 +6144,126 @@
5279
6144
  }
5280
6145
  }
5281
6146
 
6147
+ /* src/styles/_preview-overlay.css */
6148
+ .ermis-preview-overlay {
6149
+ display: flex;
6150
+ align-items: center;
6151
+ justify-content: space-between;
6152
+ padding: var(--ermis-spacing-md);
6153
+ background-color: var(--ermis-bg-secondary);
6154
+ border-top: 1px solid var(--ermis-border);
6155
+ font-family: var(--ermis-font-family);
6156
+ }
6157
+ .ermis-preview-overlay__text {
6158
+ font-size: var(--ermis-font-size-sm);
6159
+ color: var(--ermis-text-secondary);
6160
+ font-weight: 500;
6161
+ }
6162
+ .ermis-preview-overlay__button {
6163
+ background-color: var(--ermis-accent);
6164
+ color: #ffffff;
6165
+ border: none;
6166
+ border-radius: var(--ermis-radius-md);
6167
+ padding: var(--ermis-spacing-sm) var(--ermis-spacing-md);
6168
+ font-size: var(--ermis-font-size-sm);
6169
+ font-weight: 600;
6170
+ cursor: pointer;
6171
+ transition: opacity 0.2s ease, transform 0.1s ease;
6172
+ }
6173
+ .ermis-preview-overlay__button:hover {
6174
+ opacity: 0.9;
6175
+ }
6176
+ .ermis-preview-overlay__button:active {
6177
+ transform: scale(0.98);
6178
+ }
6179
+
6180
+ /* src/styles/_recovery-pin.css */
6181
+ .ermis-recovery-pin {
6182
+ display: flex;
6183
+ flex-direction: column;
6184
+ gap: 10px;
6185
+ width: 100%;
6186
+ }
6187
+ .ermis-recovery-pin__header {
6188
+ align-items: center;
6189
+ display: flex;
6190
+ gap: 8px;
6191
+ justify-content: space-between;
6192
+ }
6193
+ .ermis-recovery-pin__header h3 {
6194
+ font-size: 16px;
6195
+ font-weight: 600;
6196
+ line-height: 1.3;
6197
+ margin: 0;
6198
+ }
6199
+ .ermis-recovery-pin__badge,
6200
+ .ermis-recovery-status {
6201
+ border: 1px solid var(--ermis-border-color, #d7dde5);
6202
+ border-radius: 999px;
6203
+ color: var(--ermis-text-muted, #596579);
6204
+ display: inline-flex;
6205
+ font-size: 12px;
6206
+ font-weight: 600;
6207
+ line-height: 1;
6208
+ padding: 5px 8px;
6209
+ white-space: nowrap;
6210
+ }
6211
+ .ermis-recovery-pin__input {
6212
+ background: var(--ermis-input-bg, #fff);
6213
+ border: 1px solid var(--ermis-border-color, #d7dde5);
6214
+ border-radius: 8px;
6215
+ color: var(--ermis-text-color, #111827);
6216
+ font-size: 14px;
6217
+ min-height: 38px;
6218
+ padding: 8px 10px;
6219
+ }
6220
+ .ermis-recovery-pin__button {
6221
+ align-items: center;
6222
+ background: var(--ermis-primary-color, #2563eb);
6223
+ border: 0;
6224
+ border-radius: 8px;
6225
+ color: #fff;
6226
+ cursor: pointer;
6227
+ display: inline-flex;
6228
+ font-size: 14px;
6229
+ font-weight: 600;
6230
+ justify-content: center;
6231
+ min-height: 38px;
6232
+ padding: 8px 12px;
6233
+ }
6234
+ .ermis-recovery-pin__button:disabled {
6235
+ cursor: not-allowed;
6236
+ opacity: 0.55;
6237
+ }
6238
+ .ermis-recovery-pin__error,
6239
+ .ermis-recovery-gap {
6240
+ background: var(--ermis-danger-bg, #fff1f2);
6241
+ border: 1px solid var(--ermis-danger-border, #fecdd3);
6242
+ border-radius: 8px;
6243
+ color: var(--ermis-danger-color, #be123c);
6244
+ font-size: 13px;
6245
+ line-height: 1.4;
6246
+ padding: 8px 10px;
6247
+ }
6248
+ .ermis-recovery-status--ready {
6249
+ background: var(--ermis-success-bg, #ecfdf5);
6250
+ border-color: var(--ermis-success-border, #bbf7d0);
6251
+ color: var(--ermis-success-color, #047857);
6252
+ }
6253
+ .ermis-recovery-status--working {
6254
+ background: var(--ermis-info-bg, #eff6ff);
6255
+ border-color: var(--ermis-info-border, #bfdbfe);
6256
+ color: var(--ermis-info-color, #1d4ed8);
6257
+ }
6258
+ .ermis-recovery-status--locked,
6259
+ .ermis-recovery-status--idle {
6260
+ background: var(--ermis-muted-bg, #f8fafc);
6261
+ }
6262
+ .ermis-recovery-status--error {
6263
+ background: var(--ermis-danger-bg, #fff1f2);
6264
+ border-color: var(--ermis-danger-border, #fecdd3);
6265
+ color: var(--ermis-danger-color, #be123c);
6266
+ }
6267
+
5282
6268
  /* src/styles/index.css */
5283
6269
  /*# sourceMappingURL=index.css.map */